가장 먼저 이해해야 할 것은 P 와 NP가 문제가 아니라 언어를 분류 한다는 것 입니다. 이것이 의미하는 바를 이해하려면 먼저 다른 정의가 필요합니다.
알파벳 기호 비어 있지 않은 유한 집합이다.
{ 0
, 1
}는 ASCII 문자 집합 인 알파벳입니다. {}은 비어 있기 때문에 알파벳이 아닙니다. N (정수)은 유한하지 않기 때문에 알파벳이 아닙니다.
Σ를 알파벳 이라고하자 . 에서 심볼의 유한 수의 순서 연결 Σ는 불리며 단어 이상 Σ를 .
문자열 101
은 알파벳 { 0
, 1
} 위에있는 단어 입니다. 빈 단어 (종종 작성 ε는 ) 모든 알파벳을 통해 단어입니다. 문자열 penguin
은 ASCII 문자를 포함하는 알파벳 위에있는 단어입니다. 숫자 π의 소수점 표기는 알파벳을 통해 단어 아니다 { .
, 0
, 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
}는 유한하지 않기 때문에.
다음 과 같이 쓰여진 단어 w 의 길이 | w |는 그 안의 기호 수입니다.
예를 들어, | hello
| = 5와 | ε | = 0. 모든 단어 w 에 대해 | 승 | ∈ N 따라서 유한하다.
Σ를 알파벳 이라고하자 . 집합 Σ * 는 ε을 포함하여 Σ 이상의 모든 단어를 포함합니다 . 세트 Σ + 는 ε을 제외한 Σ 에 대한 모든 단어를 포함합니다 . 들면 N ∈ N , Σ N은 길이의 단어의 집합이고 , N .
모든 알파벳 Σ , Σ * 및 Σ + 는 무한한 셀 수있는 세트 입니다. ASCII 문자 세트에 대한 Σ의 ASCII , 정규 표현식 .*
및 .+
나타낸다 Σ의 ASCII * 와 Σ의 ASCII + 각각.
{ 0
, 1
} 7 7 비트 ASCII 코드 세트는 { 0000000
, 0000001
, ... 1111111
}. { 0
, 1
} 32 는 32 비트 정수 값의 집합입니다.
하자 Σ는 알파벳과 수 L ⊆ Σ * . L 은 Σ 이상의 언어 라고합니다 .
알파벳의 경우 Σ , 빈 세트 Σ *는 이상 사소한 언어이다 Σ는 . 전자는 종종 빈 언어 로 불린다 . 빈 언어 {}와 빈 단어 { ε } 만 포함 된 언어 가 다릅니다.
비 NaN IEEE 754 부동 소수점 값에 해당하는 { 0
, 1
} 32 의 하위 집합은 유한 언어입니다.
언어는 단어 수에 제한이 없지만 모든 언어는 셀 수 있습니다. 문자열의 집합 { 1
, 2
, ...} 진수 표기법으로 정수를 나타내는 것은 알파벳을 통해 무한한 언어 { 0
, 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
}. 문자열의 무한한 세트 { 2
, 3
, 5
, 7
, 11
, 13
, ...} 진수 표기법 소수를 나타내는 것은 이들의 부분 집합이다. 정규식과 일치하는 모든 단어를 포함 [+-]?\d+\.\d*([eE][+-]?\d+)?
하는 언어는 ASCII 문자 세트를 넘는 언어입니다 (C 프로그래밍 언어로 정의 된 유효한 부동 소수점 표현식의 서브 세트를 나타냄).
실수 세트가 셀 수 없기 때문에 모든 실수를 포함하는 언어는 없습니다 (모든 표기법으로).
하자 Σ는 알파벳과 수 L ⊆ Σ * . 기계 D는 결정 L을 각 입력에 대한 경우 w ∈ Σ * 가 산출 특성 함수 χ L ( w를 유한 한 시간 내에). 특성 함수는 다음과 같이 정의됩니다
χ L : Σ * → {0, 1}
w ↦ 1, w ∈ L
0, 그렇지 않으면
이러한 기계 를 L 의 결정 자라고 합니다 . "given w , D outputs x "에 대해 " D ( w ) = x " 라고 씁니다 .
많은 기계 모델이 있습니다. 오늘날 실용화되고있는 가장 일반적인 것은 튜링 머신 의 모델 입니다 . 튜링 머신에는 셀에 클러스터링 된 무제한 선형 스토리지가 있습니다. 각 셀은 특정 시점에서 정확히 하나의 알파벳 기호를 보유 할 수 있습니다. 튜링 머신은 일련의 계산 단계로 계산을 수행합니다. 각 단계에서 하나의 셀을 읽을 수 있으며 값을 덮어 쓰고 읽기 / 쓰기 헤드를 한 위치 씩 왼쪽 또는 오른쪽 셀로 이동할 수 있습니다. 기계가 수행 할 작업은 유한 상태 자동 장치에 의해 제어됩니다.
유한 명령 세트와 무제한 저장 공간을 가진 랜덤 액세스 머신은 튜링 머신 모델만큼 강력한 또 다른 머신 모델입니다.
이 논의를 위해, 우리는 우리가 사용하는 정확한 기계 모델로 우리를 귀찮게 할 것이 아니라 기계가 유한 한 결정 론적 제어 유닛, 무제한 저장을 가지고 계산할 수있는 일련의 단계로서 계산을 수행한다고 말하는 것으로 충분합니다.
당신이 당신의 질문에 그것을 사용했기 때문에, 나는 당신이 이미 “big-O”표기법에 익숙하다고 가정 하므로 여기에 빠른 새로 고침 만 있습니다.
하자 F를 : N은 함수가 될 →. 집합 O ( f )에는 모든 함수 g : N → N 이 포함되어 있습니다. 상수 n 0 ∈ N 및 c ∈ N 이 존재 하여 n > n 0 인 모든 n ∈ N 에 대해 g ( n ) ≤ c f ( n ).
이제 우리는 실제 질문에 접근 할 준비가되었습니다.
클래스 P는 모든 언어 포함 L 튜링 기계가 존재하는 D 결정 L 및 정수의 K ∈ N 마다 입력하도록 w , D를 가 정지 후 최대 T를 (| 승 함수의 단계를 |) T ∈ O ( n ↦ n k ).
때문에 O ( N ↦ N K ), 수학적으로 정확한 동안, 쓰기에 불편하고 읽기, 대부분의 사람들입니다 - 솔직히 말해서, 모두 자신을 제외하고는 - 일반적으로 단순히 기록 O ( N 케이 ).
바운드는 w 길이에 따라 다릅니다 . 따라서 소수의 언어에 대한 인수는 우나 레 인코딩의 숫자에 대해서만 정확합니다 . 여기서 , 숫자 n 의 인코딩 w 의 경우 인코딩 길이 | 승 | n에 비례합니다 . 실제로 그러한 인코딩을 사용하는 사람은 없습니다. 그러나 가능한 모든 요인을 시도하는 것보다 고급 알고리즘을 사용 하면 입력이 이진 (또는 다른 기준)으로 인코딩 된 경우 소수의 언어가 P로 남아 있음을 알 수 있습니다 . (대단한 관심에도 불구하고 Manindra Agrawal, Neeraj Kayal 및 Nitin Saxena에 의해서만 증명 될 수 있음 2004 년 수상 논문에서 알고리즘이 그리 간단하지 않다고 추측 할 수 있습니다.)
사소한 언어 {} 및 Σ * 와 사소하지 않은 언어 { ε }는 분명히 P (알파벳 Σ )입니다. 문자열을 입력으로 사용하는 함수를 좋아하는 프로그래밍 언어로 작성하고 문자열이 각 언어의 언어인지 여부를 알려주는 부울을 반환하고 함수에 다항식 런타임 복잡성이 있음을 증명할 수 있습니까?
모든 정규 언어 (정규 표현식으로 설명 된 언어)는 P 입니다.
하자 Σ는 알파벳과 수 L ⊆ Σ * . 두 단어 w , c ∈ Σ * 의 인코딩 된 튜플을 취하고 유한 단계 수 이후에 0 또는 1을 출력 하는 기계 V 는 다음 특성을 갖는 경우 L에 대한 검증기 입니다 .
- (감안할 승 , C ) V 를 출력 한 경우에만 w ∈ L .
- 모든 w ∈ L 에 대해 V ( w , c ) = 1 인 c ∈ Σ * 가 있습니다 .
C 위의 정의는이라고 증인 (또는 인증서 ).
검증자가 w가 실제로 L에 있더라도 잘못된 증인에 대해 잘못된 부정을 줄 수 있습니다. 그러나 거짓 긍정을주는 것은 허용되지 않습니다. 또한 언어의 각 단어마다 적어도 한 명의 증인이 있어야합니다.
소수가 아닌 모든 정수의 십진 인코딩을 포함하는 COMPOSITE 언어의 경우 감시는 인수 분해가 될 수 있습니다. 예를 들어, ∈ COMPOSITE (659, 709)
의 증인입니다 467231
. 증인이없는 동안 한 장의 종이에서 쉽게 확인할 수 있으므로 컴퓨터를 사용하지 않으면 467231이 소수가 아니라는 것을 증명할 수 있습니다.
적절한 증인을 찾는 방법에 대해서는 아무 말도하지 않았습니다. 이것은 비 결정적 부분입니다.
클래스 NP는 모든 언어 포함 L 튜링 기계가 존재하는 V가 있는지 확인 된 L 및 정수의 K ∈ N 마다 입력되도록 ( w , C ), V를 정지하고 이후 최대 T (| W |) 함수의 단계 T ∈ O ( N ↦ N K ).
참고 위의 정의는 각각 것을 의미하는 것이 w ∈ L 증인이 존재 C 와 일 | c | ≤ T (| w |). 튜링 기계는 더 많은 증인의 상징을 볼 수 없습니다.
NP 는 P 의 슈퍼 세트입니다 (이유는 무엇입니까?). NP 에는 있지만 P 에는없는 언어가 있는지는 알 수 없습니다 .
정수 인수 분해는 언어 자체가 아닙니다. 그러나 의사 결정 문제 와 관련된 언어를 구성 할 수 있습니다 . 즉, n 이 d ≤ m 인 인수 d 를 갖도록 모든 튜플 ( n , m ) 을 포함하는 언어입니다 . 이 언어를 FACTOR라고하겠습니다. FACTOR를 결정하는 알고리즘이있는 경우 각 소인수에 대해 재귀 이진 검색을 수행하여 다항 오버 헤드만으로 전체 인수 분해를 계산하는 데 사용할 수 있습니다.
FACTOR가 NP 에 있음을 쉽게 알 수 있습니다. 적절한 증인은 단순히 요인 d 자체 일 뿐이며 모든 검증자는 d ≤ m 및 n mod d = 0 인지 확인해야 합니다.이 모든 것은 다항식 시간으로 수행 할 수 있습니다. (이것은 즉, 다시 기억 부호화의 길이를 계산하고 그 즉 로그 의 N ).
FACTOR도 P에 있음을 보여줄 수 있다면 멋진 상을 많이받을 수 있습니다. (오늘날 암호화의 상당 부분을 깨뜨 렸습니다.)
NP의 모든 언어 에는 결정 론적으로 결정 하는 무차별 알고리즘이 있습니다. 그것은 단순히 모든 증인에 대해 철저한 검색을 수행합니다. (증인의 최대 길이는 다항식에 의해 제한됩니다.) 따라서 PRIMES를 결정하는 알고리즘은 실제로 COMPOSITE를 결정하는 무차별 대입 알고리즘이었습니다.
최종 질문을 해결하려면 축소 를 도입해야합니다 . 감소는 이론적 인 컴퓨터 과학의 매우 강력한 개념입니다. 한 문제를 다른 문제로 줄이는 것은 기본적으로 다른 문제를 해결하여 한 문제를 해결하는 것을 의미합니다.
Σ 는 알파벳이고 A 와 B 는 Σ 이상의 언어 라고 하자 . A는 이고 다항식 시간 대일 환원성 을 B 기능이 존재하는 경우 F를 : Σ * → Σ * 다음 속성.
- w ∈ ⇔ F ( w ∈) B 모두 w ∈ Σ * .
- 함수 f 는 다항식으로 묶인 여러 단계에서 모든 입력 w 에 대해 튜링 머신에 의해 계산 될 수 있습니다. 승 |.
이 경우 우리는 A ≤ p B 라고 씁니다 .
예를 들어, A를 삼각형이 포함 된 모든 그래프 (인접 행렬로 인코딩 된)가 포함 된 언어로 지정하십시오. (삼각형은 길이가 3의주기입니다.) B 가 0이 아닌 모든 행렬을 포함하는 언어가되도록하십시오. (매트릭스 추적 주요 대각 원소의 합이다.) 다음에 A를 다항식 시간 대일 환원성 인 B . 이를 증명하려면 적절한 변환 함수 f 를 찾아야합니다 . 이 경우, 우리는 설정할 수 F를 3 계산하는 RD의 인접성 매트릭스 전원. 여기에는 다항식 복잡도를 갖는 두 개의 행렬 행렬 제품이 필요합니다.
L ≤ p L 인 것은 사소한 사실입니다 . (공식적으로 증명할 수 있습니까?)
이제 이것을 NP에 적용하겠습니다 .
언어 L은 이다 NP의 -hard 경우에만, L '≤ P L 모든 언어에 대한 L '∈ NP .
NP -hard 언어는 나에 있지 않을 수 있습니다 NP 자체.
언어 L은 이다 순이익 - 완전한 경우만
가장 유명한 NP 완성 언어는 SAT입니다. 만족할 수있는 모든 부울 수식이 포함되어 있습니다. 예를 들어, ( a ∨ b ) ∧ (¬ a ∨ ¬ b ) ∈ SAT. 유효한 감시는 { a = 1, b = 0}입니다. 공식 ( a ∨ b ) ∧ (¬ a ∨ b ) ∧ ¬ b ∉ SAT. (어떻게 증명하겠습니까?)
SAT∈ NP 를 나타내는 것은 어렵지 않습니다 . SAT 의 NP- hardness 를 보여주는 것은 약간의 작업이지만 1971 년 Stephen Cook에 의해 수행되었습니다 .
그 한 가지 NP 완성 언어가 알려 지면 축소를 통해 다른 언어 의 NP 완성도 를 나타내는 것이 비교적 간단했습니다 . 언어 A 가 NP- hard 로 알려진 경우 A ≤ p B를 표시하면 B 도 NP- hard 임을 나타냅니다 (“≤ p ” 의 전이를 통해 ). 1972 년 Richard Karp 는 NP 가 보여줄 수있는 21 개 언어 목록을 발표했습니다.SAT의 (전이) 감소를 통해 완료. (이 답변에서 실제로 읽어야 할 것이 권장되는 유일한 논문입니다. 다른 논문과 달리 이해하기 어렵지 않고 축소를 통해 NP- 완전성을 입증하는 방법에 대한 좋은 아이디어를 제공 합니다.)
마지막으로 간단한 요약입니다. NPH 및 NPC 기호를 사용하여 각각 NP -hard 및 NP -complete 언어 의 클래스를 나타냅니다 .
- P ⊆ NP
- NPC ⊂ NP 및 NPC ⊂ NPH , 실제로 NPC = NP ∩ NPH 정의
- ( A ∈ NP ) ∧ ( B ∈ NPH ) ⇒ A ≤ p B
P = NP 인 경우에도 포함 NPC ⊂ NP 가 적합 합니다. 이를 확인하려면, 자신이 더 적지 않은 언어가 사소한 일에 감소하지 않으며 사소한의 언어가 될 수 있음을 분명히 P 뿐만 아니라 사소하지 않은 언어 순이익은 . 그러나 이것은 (흥미롭지 않은) 코너 케이스입니다.
추가
혼란의 주요 원인은 실제로 입력의 길이 를 참조 할 때 알고리즘 입력 의 해석 으로 " O ( n ↦ f ( n ) " 의 " n "을 생각한 것으로 보입니다 . 이것은 알고리즘의 점근 적 복잡성 이 입력에 사용 된 인코딩에 의존한다는 것을 의미하기 때문에 중요한 차이점 입니다.
이번 주, 가장 큰 알려진 메르 센 총리 에 대한 새로운 기록 이 달성되었습니다. 현재 알려진 가장 큰 소수는 2 74 207 281 − 1입니다.이 숫자는 너무 커서 두통을 유발하므로 다음 예에서 더 작은 것을 사용할 것입니다. 2 31 – 1 = 2 147 483 647. 다른 방식으로 인코딩됩니다.
- Mersenne 지수로 10 진수로 표시 :
31
(2 바이트)
- 10 진수로 :
2147483647
(10 바이트)
- 단항 번호로 : 를 2 147 483 640 개 이상으로 대체 할
11111…11
곳 (거의 2 GiB)…
1
이 모든 문자열은 동일한 숫자를 인코딩하고이 중 하나가 주어지면 동일한 숫자의 다른 인코딩을 쉽게 구성 할 수 있습니다. 원하는 경우 10 진수 인코딩을 2 진, 8 진 또는 16 진으로 바꿀 수 있습니다. 길이는 상수 요소 만 변경합니다.
원시성을 테스트하기위한 순진한 알고리즘은 단항 인코딩에 대해서만 다항식입니다. AKS 소수 판별법은 소수 (또는 다른 기재에 대한 다항식 B ≥ 2). 뤼카 - 레머 소수 판별법은 메르 센에 대한 잘 알려진 알고리즘 소수가 인 M의 P를 함께 P 홀수 프라임하지만 여전히 메르 센 지수의 바이너리 인코딩의 길이에 지수 함수 P (다항식 P ).
알고리즘의 복잡성에 대해 이야기하려면 어떤 표현을 사용하는지 명확하게 나타내는 것이 매우 중요합니다. 일반적으로 가장 효율적인 인코딩이 사용된다고 가정 할 수 있습니다. 즉, 정수에 대한 이진입니다. 모든 소수가 Mersenne 소수는 아니므로 Mersenne 지수를 사용하는 것이 일반적인 인코딩 체계는 아닙니다.
이론적 암호화에서는 많은 알고리즘이 공식적으로 첫 번째 매개 변수로 ks 1
의 완전히 쓸모없는 문자열을 전달합니다 . 이 알고리즘은 결코이 매개 변수에 보지 않는다 그러나 그것은 공식적으로 다항식 될 수 있습니다 K 는 IS, 보안 매개 변수 조정 절차의 보안을 사용했다.
이진 인코딩의 의사 결정 언어가 NP -complete 인 일부 문제의 경우, 포함 된 숫자의 인코딩이 단항으로 전환되면 의사 결정 언어는 더 이상 NP 완료 되지 않습니다 . 다른 문제에 대한 의사 결정 언어는 그때까지도 NP 완료 상태로 남아 있습니다 . 후자라고 강하게 순이익 - 완전한 . 가장 잘 알려진 예는 빈 포장 입니다.
입력이 압축 되면 알고리즘의 복잡성이 어떻게 변하는 지 보는 것도 흥미 롭습니다 . 메르 센 소수의 예에서 우리는 세 가지 인코딩을 보았는데, 각각의 인코딩은 이전보다 로그 압축이 더 압축되었습니다.
1983 년 Hana Galperin과 Avi Wigderson 은 그래프의 입력 인코딩이 로그 압축 될 때 일반적인 그래프 알고리즘의 복잡성에 관한 흥미로운 논문을 작성했습니다. 이러한 입력의 경우, 위에서 삼각형이 포함 된 그래프의 언어 ( P 는 명확하게 P에 있음 )가 갑자기 NP 완성이됩니다.
P 와 NP 와 같은 언어 클래스 는 문제가 아닌 언어를 위해 정의 되었기 때문 입니다.