원시성 검정

Primality test

프라이머리티 테스트는 입력 번호가 프라이머인지 여부를 결정하기 위한 알고리즘이다. 수학의 다른 분야 중에서도 암호학에 쓰인다. 소수성 검정은 정수 인자화와 달리 일반적으로 소수 인자를 주지 않으며 입력 숫자가 소수인지 여부만 명시한다. 인자화는 계산적으로 어려운 문제인 반면, 원시성 시험은 비교적 쉽다(그 런 시간은 입력 크기다항식이다). 어떤 원시성 테스트는 숫자가 소수라는 것을 증명하는 반면, 밀러-라빈과 같은 다른 테스트는 숫자가 복합적이라는 것을 증명한다. 따라서 후자를 원시성 검사 대신 복합성 검사라고 하는 것이 더 정확할 수 있다.

간단한 방법

가장 간단한 소수성 시험은 시험 분할이다. 입력 번호인 n을 지정하면 2와 nn 사이의 소수점(즉, 분할이 나머지를 남기지 않는지)으로 균등하게 구분되는지 확인한다. 만약 그렇다면, n복합적이다. 그렇지 않으면 황금이다.[1]

예를 들어, 다음 숫자로 균등하게 구분되는 숫자 100을 고려하십시오.

2, 4, 5, 10, 20, 25, 50

가장 큰 요인인 50은 100의 절반이라는 점에 유의한다. 이것은 모든 n에 대해 적용된다: 모든 divisor는 / 보다 작거나 같다

실제로 / 까지 가능한 모든 구분자를 테스트할 때 우리는 몇 가지 요인을 두 번 발견할 것이다. 이를 준수하려면 구분자 목록을 제품 목록으로 다시 작성하십시오(각각 100과 동일).

2 × 50, 4 × 25, 5 × 20, 10 × 10, 20 × 5, 25 × 4, 50 × 2

10 × 10이 지난 제품은 이전 제품에 나타난 반복 번호에 불과하다는 점에 유의하십시오. 예를 들어, 5 × 20과 20 × 5는 동일한 숫자로 구성된다. 이는 모든 n에 적용된다. n의 모든 고유 구분자는 n보다 작거나 같은 숫자이므로, 이를 지나쳐 검색할 필요가 없다.[1] (이 예에서는 n = 100 = 10).

짝수가 n을 나눌 수 있다면 2를 나눌 수 있기 때문에 2보다 큰 짝수 또한 모두 제거할 수 있다.

17의 영장성을 시험하기 위해 시험 분과를 사용합시다. 우리는 최대 nn까지의 구분자, 즉 4. {\ 4 즉 2, 3, 4에 대한 시험만 하면 된다. 짝수라서 4를 건너뛸 수 있는데, 4가 17을 고르게 나눌 수 있다면 2도 되고 2도 이미 리스트에 올라 있다. 그러면 2와 3이 남는다. 우리는 이 숫자들을 각각 17개씩 나누는데, 양쪽 모두 17개를 균등하게 나누지 않는다는 것을 알게 되었다. 그래서 17이 황금이다.

우리는 이 방법을 더 개선할 수 있다. 3보다 큰 모든 프리타임은 6k ± 1 형식이며, 여기서 k는 0보다 큰 정수임을 준수한다. 모든 정수는 (6k + i)로 표현할 수 있기 때문이다. 여기서 i = -1, 0, 1, 2, 3 또는 4이다. 2분할(6k + 0), 6k + 2분할(6k + 2) 및 3분할(6k + 3)에 유의하십시오. 따라서 n을 2로 나누는지 3으로 나누는지 시험한 다음, 6 ± n {\ 형식의 모든 번호를 통해 확인하는 것이 보다 효율적인 방법이다 이는 n까지의 모든 숫자를 테스트하는 것보다 3배 빠르다.

더 일반화하면, c# (c primaryorial)보다 큰 모든 primimes는 c# · k + i 형식이다. 여기c와 k는 정수이고 i는 c#와 같은 숫자들을 나타낸다. 를 들어 c = 6으로 한다.다음 c# = 2 · 3 · 5 = 30. 모든 정수는 i = 0, 1, 2, ..., 29k의 정수인 30k + i 형식이다. 그러나 2는 0, 2, 4, ..., 28, 3은 0, 3, 6,... 27, 5는 0, 5, 10, ..., 25. 따라서 30을 초과하는 모든 소수점은 i = 1, 7, 11, 13, 17, 19, 23, 29( gcd(i,30) = 130k + i로 나눈다. i와 30이 합성이 아니라면 30k + i는 30의 소수, 즉 2, 3 또는 5의 소수점 이하에 의해 분할되며 따라서 소수점 이하가 될 수 없다는 점에 유의하십시오. (주: 위의 조건을 만족하는 모든 숫자가 소수인 것은 아니다. 예를 들어: 437은 c#(7)=210,k=2,i=17의 c#k+i 형식이다. 그러나 437은 19*23)과 같은 복합수다.

c 로서 c#k + i가 일정한 범위를 인수할 수 있는 값의 수가 감소하여 n을 시험하는 시간이 감소한다. 이 방법의 경우 c보다 작은 모든 소수점 단위로 불분명한 것을 확인할 필요도 있다. 앞의 것과 유사한 관측치는 반복적으로 적용할 수 있어 에라토스테네스 체가 주어진다.

이러한 방법(및 아래에 언급된 다른 모든 방법)을 가속화하는 좋은 방법은 모든 프리타임 목록을 최대 200까지 사전 계산하고 저장하는 것이다. (이러한 목록은 알려진 모든 프리타임에 대해 각각의 증분 m을 테스트하는 알고리즘이나 에라토스테네스 체로 계산할 수 있다. 그런 다음 심각한 방법으로 n의 primality를 시험하기 전에 n은 우선 리스트의 prime에 의해 disibility를 확인할 수 있다. 만약 그 숫자들 중 하나로 나눌 수 있다면, 그것은 복합적이고, 더 이상의 시험은 생략할 수 있다.

단순하지만 매우 비효율적인 원시성 테스트는 다음과 같은 경우에만 p가 프라임이라는 윌슨의 정리를 사용한다.

비록 이 방법에는 p 모듈형 승수가 필요하지만, 이를 비실용적으로 나타내면 프라임과 모듈형 잔류물에 대한 이론이 더 많은 실용적인 방법의 기초를 이룬다.

예시 코드

파이톤

다음은 앞에서 언급한 간단한 6k ± 1 최적화를 이용한 파이썬에서의 간단한 프라이머리티 테스트다. 아래에서 설명하는 보다 정교한 방법은 큰 n의 경우 훨씬 빠르다.

반항하다 is_prime(n: 인트로) -> 바가지 긁다:     ""6k+-1 최적화를 사용한 Primality 테스트."""     만일 n <= 3:         돌아오다 n > 1     만일 n % 2 == 0 또는 n % 3 == 0:         돌아오다 거짓의     i = 5     하는 동안에 i ** 2 <= n:         만일 n % i == 0 또는 n % (i + 2) == 0:             돌아오다 거짓의         i += 6     돌아오다 진실의 

C#

다음은 위와 같은 최적화를 이용한 C#의 원시성 시험이다.

바가지 긁다 이스프라임(인트로 n) {     만일 (n == 2    n == 3)         돌아오다 진실의;      만일 (n <= 1    n % 2 == 0    n % 3 == 0)         돌아오다 거짓의;      을 위해 (인트로 i = 5; i * i <= n; i += 6)     {         만일 (n % i == 0    n % (i + 2) == 0)             돌아오다 거짓의;     }      돌아오다 진실의; } 

자바스크립트

다음은 위와 같은 최적화를 이용한 자바스크립트의 원시성 시험이다.

기능을 하다 이스프라임(숫자) {   만일 (숫자 <= 3) 돌아오다 숫자 > 1;      만일 ((숫자 % 2 === 0)    (숫자 % 3 === 0)) 돌아오다 거짓의;      하게 하다 수를 세다 = 5;      하는 동안에 (수학.포우(수를 세다, 2) <= 숫자) {     만일 (숫자 % 수를 세다 === 0    숫자 % (수를 세다 + 2) === 0) 돌아오다 거짓의;          수를 세다 += 6;   }      돌아오다 진실의; } 

R

다음은 위와 동일한 최적화를 이용한 R(프로그래밍 언어)의 프라이머리티 시험이다.

is.prime <- 기능을 하다(번호를 붙이다) {   만일(번호를 붙이다 <= 1    번호를 붙이다 %% 2 ==0    번호를 붙이다 %% 3 == 0) {     돌아오다 (거짓의)   } 다른 만일 (번호를 붙이다 == 2    번호를 붙이다 == 3 ) {     돌아오다(진실의)   }   i <- 5   하는 동안에 (i*i <= 번호를 붙이다) {     만일(번호를 붙이다 %% i == 0    번호를 붙이다 %% (i+2)==0) {       돌아오다(거짓의)     } 다른 {       돌아오다(진실의)     }     i = i + 6   }   돌아오다(진실의) } 

휴리스틱 테스트

이러한 테스트들은 실제로 잘 작동하는 것처럼 보이지만 검증되지 않았고 따라서 기술적으로는 전혀 알고리즘이 아니다. 페르마 테스트와 피보나치 테스트는 간단한 예로서, 조합할 때 매우 효과적이다. John Selfridgep가 홀수이고 p ≡ ±2 (mod 5)이면 p가 prime이 될 것이라고 추측했다.

  • 2p−1 ≡ 1 (mod p),
  • fp+1 ≡ 0 (mod p),

여기서 fk k-th 피보나치 숫자다. 첫 번째 조건은 베이스 2를 이용한 페르마 원시성 시험이다.

일반적으로 p ≡ a(mod x2+4)가 2차 비재수(mod x+42)인 경우, 다음 조건이 유지되면 p가 prime이어야 한다.

  • 2p−1 ≡ 1 (mod p),
  • f(1) p+1≡ 0(mod p),

f(x)kx에서 k-th 피보나치 다항식이다.

셀리지, 칼 포머런스, 새뮤얼 와그스태프가 함께 620달러를 제시한다. 이 문제는 2015년 9월 11일 현재도 공개돼 있다.[2]

확률론적 검정

확률론적 시험은 복합적인 숫자에 속을 확률을 입증할 수 있는 한계를 제공한다는 점에서 휴리스틱스보다 더 엄격하다. 많은 인기 있는 원시성 테스트는 확률론적 테스트다. 이러한 테스트는 테스트된 숫자 n을 제외하고, 일부 샘플 공간에서 무작위로 선택된 일부 다른 숫자를 사용한다. 일반적인 무작위화된 원시성 테스트는 프라임 숫자를 합성수로 보고하지 않지만, 복합적인 숫자를 프라이밍으로 보고하는 것은 가능하다. 오차의 확률은 a의 몇 개의 독립적으로 선택된 값을 사용하여 시험을 반복함으로써 줄일 수 있다; 일반적으로 사용되는 두 가지 시험의 경우, a 검출 n의 합성도의 절반 이상대해, k의 반복은 오차 확률을 최대 2까지k 감소시키며, 이는 k를 증가시켜 임의로 작게 만들 수 있다.

무작위화 원시성 시험의 기본 구조는 다음과 같다.

  1. 임의로 숫자 a를 선택한다.
  2. a와 주어진 숫자 n을 포함하는 동일성(선택한 검정에 대응)을 확인한다. 평등이 참이 되지 않으면 n은 합성수이고 a는 합성수의 증인이 되고 시험은 중단된다.
  3. 필요한 정확도에 도달할 때까지 1단계로 돌아가십시오.

한 번 이상 반복한 후 n이 복합적인 숫자로 판명되지 않으면 primary로 선언할 수 있다.

철분 원시성 검정

가장 단순한 확률론적 원시성 테스트는 페르마 원시성 테스트(실제 복합성 테스트)이다. 다음과 같이 작동한다.

정수 n을 지정하면 n대한 coprime 일부 정수를 선택하고 modulon − 1 n을 계산한다. 결과가 1과 다르면 n은 복합적이다. 만약 그것이 1이라면, n이 프라임일 수도 있다.

an−1(modulo n)가 1이지만 n이 prime이 아니라면 nprinciprime이라 하여 a를 base로 한다. 실제로 우리는 a(modulo n)가n−1 1이면 n이 보통 prime이라고 관찰한다. 그러나 여기에 counterexample이 있다: n = 341이고 a = 2인 경우,

비록 341 = 11, 31은 복합이지만. 사실 341은 가장 작은 유사점 2이다(의 그림 1 참조).

2.5×10보다10 적은 21853개의 가성비 베이스 2만 있다(의 1005페이지 참조). 즉, n에서 최대 2.5×10까지의10 경우, 2n−1(모듈로 n)가 1이면 n이 prime이며, n이 21853 가성 중 하나가 아니면 n이 prime이다.

일부 합성수(카르미카엘 수)는n − 1 a가 n과 같은 시간일 때마다 1(모듈로 n)인 속성을 갖는다. 가장 작은 예는 n = 561 = 3/11·17이며, 여기서 a560 561까지의 모든 조합에 대해 1(모듈로 561)이다. 그럼에도 불구하고, 예를 들어 RSA 공개키 암호 알고리즘의 키 생성 단계에서 빠른 숫자의 선별이 필요한 경우 페르마트 테스트가 자주 사용된다.

밀러-라빈 및 솔로베이-스트라센 원시성 검정

밀러-라빈 소수성 시험 솔로베이-스트라센 소수성 시험은 모든 합성물을 검출하는 보다 정교한 변형이다(다시 한 번 말하지만, 이는 모든 합성수 n, 최소 3/4 (Miller-Rabin) 또는 1/2 (Solovay-Strassen) 숫자의 합성이 n의 증인이 된다). 이것들은 또한 복합성 시험이다.

밀러-라빈 원시성 테스트는 다음과 같이 작동한다: 정수 n을 지정하면 양의 정수 a < n. 2ds = n - 1을 선택한다. 여기서 d는 홀수다. 만약

그리고

d - ( n){\ a 모든 r - , r

그러면 n은 복합적이고 복합성의 증인이 된다. 그렇지 않으면 n이 프라임일 수도 있고 아닐 수도 있다. 밀러-라빈 테스트는 강력한 유사 시간 테스트다(PSW[3] 페이지 1004 참조).

Solovay-Strassen 원시성 테스트는 다른 동등성을 사용한다: 홀수 n을 지정하면, 일부 정수 a < n을 선택한다.

( - )/ ( n afrac { 여기서 ( \n}\n}\n\n}\ 자코비 기호, 자코비 기호,

그러면 n은 복합적이고 복합성의 증인이 된다. 그렇지 않으면 n이 프라임일 수도 있고 아닐 수도 있다. Solovay-Strassen 테스트는 오일러 유사 시간 테스트(PSW[3] 페이지 1003 참조)이다.

a의 각 개별 값에 대해 Solovay-Strassen 테스트는 Miller-Rabin 테스트보다 약하다. 예를 들어 n = 1905 및 a = 2인 경우 밀러-라빈 검정은 n이 복합적인 것으로 나타나지만 Solovay-Strassen 검정은 그렇지 않다. 1905년은 오일러 유사시 기반 2이지만 강력한 유사시 기반 2가 아니기 때문이다(이는 PSW의[3] 그림 1에 설명되어 있다).

프로베니우스 원시성 검정

밀러-라빈과 솔로바이-스트라센 원시성 테스트는 단순하며 다른 일반 영장성 테스트보다 훨씬 빠르다. 효율을 더욱 향상시키는 한 가지 방법은 프로베니우스 유사성 시험이다. 이 시험의 한 라운드는 밀러-라빈 라운드의 약 3배 정도 걸리지만 밀러-라빈 7라운드에 버금가는 확률을 달성한다.

프로베니우스 테스트는 루카스 유사성 테스트의 일반화다.

Baillie-PSW 원시성 검정

더빌리-PSW 원시성 테스트는 페르마 또는 밀러-라빈 테스트와 루카스 개연성 프라임 테스트를 결합하여 알려진 백반샘플이 없는 원시성 테스트를 받는 확률론적 원시성 테스트다. 즉, 이 시험에서 n이 아마도 prime이라고 보고되는 알려진 복합 n은 없다.[4][5] n< 2 에 대한 counterrexamp가 없는 것으로 나타났다

기타 시험

레오나드 아들만과 명 데 황은 타원 곡선 원시성 시험의 오류 없는(그러나 예상된 다항식 시간) 변형을 제시하였다. 다른 확률론적 시험과 달리 이 알고리즘은 소수점이 소수라는 것을 증명하는 데 사용될 수 있다.[6] 그 알고리즘은 실행 속도가 엄청나게 느리다.

양자 컴퓨터를 사용할 수 있다면 원시성은 고전적인 컴퓨터를 사용하는 것보다 더 빨리 점증적으로 테스트될 수 있을 것이다. Pocklington primality test와 정수 인자화 방법인 Shor의 알고리즘하면 O(( n) 3 ( log n) 로그 로그 ) {\ O n에서 문제를 해결할 수 있다[7]

빠른 결정론적 검정

20세기 초, 페르마의 작은 정리의 골격이 원시성을 시험하는 데 사용될 수 있다는 것을 보여주었다.[8] 이것은 Pocklington의 영장성을 검사하는 결과를 낳았다.[9] 그러나, 이 테스트는 n - 1의 부분적인 인자를 요구하기 때문에 최악의 경우 주행 시간은 여전히 느렸다. 순진한 방법보다 훨씬 빠른 첫 번째 결정론적 원시성 테스트는 사이클론적 테스트였다; 그 런타임은 O(log n)c log log log n로 증명될 수 있다. 여기서 n은 원시성을 테스트할 수 있는 숫자이고 cn과 일정하게 독립적이다. 더 많은 개선이 이루어졌지만, 어떤 것도 다항식 실행 시간을 가지고 있다는 것을 증명할 수 없었다. (실행 시간은 입력의 크기에 따라 측정되며, 이 경우 ~ log n이며, 숫자 n을 나타내는 데 필요한 비트 수입니다.) 타원곡선 원시성 시험은 분석수 이론에 대한 일부 추측이 참일 경우 O(log n)6에서 실행된다는 것이 증명될 수 있다.[which?] 마찬가지로 일반화된 리만 가설에서는 확률론적 밀러-라빈 시험의 기초를 이루는 결정론적 밀러의 시험õ(log n)4[10]에서 실행되는 것을 증명할 수 있다. 실제로 이 알고리즘은 처리 가능한 숫자의 크기에 대해 다른 두 알고리즘보다 느리다. 이 두 가지 방법의 구현은 다소 어렵고 프로그래밍 오류의 위험을 발생시키기 때문에 종종 느리지만 간단한 시험을 선호한다.

2002년, 최초의 조건 없는 결정론적 다항식 시간 테스트가 마닌드라 아그라왈, 네에라즈 카얄, 니틴 색세나에 의해 발명되었다. AKS 원시성 테스트는 ((log n)12에서 실행되며(그들의 논문 발표 개정에서 õ(log n)7.5[11]로 개선됨), 소피 저메인 추측이 사실이라면 õ(log n)6로 더 줄일 수 있다.[12] 그 후, Lenstra와 Pomerance는 시간 Ⅱ(log n)6로 무조건 실행되는 시험 버전을 제시했다.[13]

아그라왈, 카얄, 색세나는 아그라왈의 추측이 사실이라면 if(log n)3에서 실행될 알고리즘의 변형을 제안하지만, 헨드릭 렌스트라와 칼 포메랑스의 휴리스틱적인 주장은 아마도 거짓일 것이라는 것을 암시한다.[11] 아그라왈의 추측의 변형판인 아그라왈-포포비치 추측이 여전히 사실일지도 모른다.[14]

복잡성

계산 복잡성 이론에서 소수점에 해당하는 공식 언어는 PRIMES로 표기된다. PRIMES가 Co-NP에 있다는 것을 쉽게 알 수 있다. PRIMES는 비결정론적으로 인자를 추측하여 복합성을 결정할 수 있기 때문에 Co-NP에 보완된 COMPITES는 NP에 있다.

1975년, Vaughan Pratt는 다항식 시간에 확인할 수 있는 원시성에 대한 인증서가 존재한다는 것을 보여주었고, 따라서 PRIMES는 NP에 있었고, 따라서 NP co coNP에 있음을 보여주었다. 자세한 내용은 원시성 인증서를 참조하십시오.

솔로바이-스트라센과 밀러-라빈 알고리즘의 후속 발견으로 PRIMES는 coRP에 들어갔다. 1992년 애들레만-Huang[6] 알고리즘은 복잡성을 ZPP = RP co coRP로 줄였고, 이는 Pratt의 결과를 대체했다.

1983년의 Adleman-Pomerance-Rumely primality 테스트는 PRIMES를 QP(Quasi-polynomial time)에 넣었는데, 위에서 언급한 클래스와는 비교가 되지 않는 것으로 알려져 있다.

실제의 트랙터성, 리만 가설을 가정한 다항식 시간 알고리즘, 그리고 다른 유사한 증거들 때문에, 원시성이 다항식 시간에 해결될 수 있다는 것은 오랫동안 의심받았지만 증명되지는 않았다. AKS 원시성 시험의 존재는 마침내 이 오랜 문제를 해결하고 PRIMES를 P에 배치했다. 다만 PRIMES는 P-complete로 알려져 있지 않고 NC나 L P 내부에 놓여 있는 수업에 놓여 있는지 알 수 없다. PRIMES는 AC0 없는 것으로 알려져 있다.[15]

수이론적 방법

루카스 시험프로스의 시험과 같이 숫자가 프라임인지 여부를 시험하기 위한 특정한 숫자 이론적 방법이 존재한다. 이러한 시험은 일반적으로 n + 1, n - 1 또는 이와 유사한 양의 인자가 필요하며, 이는 범용 원시성 시험에 유용하지 않음을 의미하지만, 시험한 숫자 n이 특수한 형태를 갖는다고 알려져 있을 때 상당히 강력한 경우가 많다.

루카스 테스트는 a원시 루트 모듈로 n일소수 a modulo n승수 순서n - 1이라는 사실에 의존한다. n에 대해 a가 원시임을 보여줄 수 있다면 n이 프라임임을 보여줄 수 있다.

참조

  1. ^ Jump up to: a b 리젤(1994) 페이지 2-3
  2. ^ 존 셀프리지#셀프리지의 원시성 검사에 대한 추측
  3. ^ Jump up to: a b c d e Carl Pomerance; John L. Selfridge; Samuel S. Wagstaff, Jr. (July 1980). "The pseudoprimes to 25·109" (PDF). Mathematics of Computation. 35 (151): 1003–1026. doi:10.1090/S0025-5718-1980-0572872-7.
  4. ^ Robert Baillie; Samuel S. Wagstaff, Jr. (October 1980). "Lucas Pseudoprimes" (PDF). Mathematics of Computation. 35 (152): 1391–1417. doi:10.1090/S0025-5718-1980-0583518-6. MR 0583518.
  5. ^ Robert Baillie; Andrew Fiori; Samuel S. Wagstaff, Jr. (July 2021). "Strengthening the Baillie-PSW Primality Test". Mathematics of Computation. 90 (330): 1931–1955. arXiv:2006.14425. doi:10.1090/mcom/3616.
  6. ^ Jump up to: a b Adleman, Leonard M.; Huang, Ming-Deh (1992). Primality testing and Abelian varieties over finite field. Lecture notes in mathematics. 1512. Springer-Verlag. ISBN 3-540-55308-8.
  7. ^ Chau, H. F.; Lo, H.-K. (1995). "Primality Test Via Quantum Factorization". arXiv:quant-ph/9508005.
  8. ^ Pocklington, H. C. (1914). "The determination of the prime or composite nature of large numbers by Fermat's theorem". Cambr. Phil. Soc. Proc. 18: 29–30. JFM 45.1250.02.
  9. ^ Weisstein, Eric W. "Pocklington's Theorem". MathWorld.
  10. ^ Gary L. Miller (1976). "Riemann's Hypothesis and Tests for Primality". Journal of Computer and System Sciences. 13 (3): 300–317. doi:10.1016/S0022-0000(76)80043-8.
  11. ^ Jump up to: a b Agrawal, Manindra; Kayal, Neeraj; Saxena, Nitin (2004). "Primes is in P" (PDF). Annals of Mathematics. 160 (2): 781–793. doi:10.4007/annals.2004.160.781.
  12. ^ Agrawal, Manindra; Kayal, Neeraj; Saxena, Nitin (2004). "PRIMES is in P" (PDF). Annals of Mathematics. 160 (2): 781–793. doi:10.4007/annals.2004.160.781.
  13. ^ Carl Pomerance & Hendrik W. Lenstra (July 20, 2005). "Primality testing with Gaussian periods" (PDF).
  14. ^ Popovych, Roman (December 30, 2008). "A note on Agrawal conjecture" (PDF).
  15. ^ 알렌더, M. Saks, I.E. 슈팔린스키, 원시성에 대한 하한선, J. Comp. 시스템. 과학 62(2001), 페이지 356–366.

원천

외부 링크