맨위로가기

이차 체

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

이차 체(Quadratic Sieve, QS)는 정수 소인수분해 알고리즘 중 하나로, 페르마 인수분해법과 딕슨 인수분해법을 개선한 방식이다. 이 알고리즘은 x² ≡ y² (mod n)을 만족하는 x와 y를 찾아 n을 소인수분해한다. 이차 체는 데이터 수집과 데이터 처리 두 단계로 진행되며, 데이터 수집 단계는 병렬 처리에 적합하지만 데이터 처리 단계는 많은 메모리를 필요로 한다.

이차 체는 딕슨 인수분해법과 유사하게 여러 a에 대해 a²/n의 나머지를 계산하고, 그 곱이 제곱수가 되는 부분 집합을 찾아 제곱 합동을 생성한다. 다중 다항식, 큰 소수 변형 등의 최적화 기법을 사용하여 알고리즘의 효율성을 높일 수 있다. 이차 체는 큰 수를 소인수분해하는 데 사용되었으며, 현재는 특정 크기 미만의 약수를 구하는 데 렌스트라의 타원곡선 알고리즘(ECM)과 함께 사용되거나, 약수가 두 개가 될 때까지 나눈 후 적용된다. 이차 체는 일반 수체 체(GNFS)가 등장하기 전까지 가장 빠른 범용 인수분해 알고리즘이었으며, 1994년 RSA-129를 소인수분해하는 데 사용되었다. 현재 QS 인수분해 기록은 140자리(463비트) RSA-140이다.

더 읽어볼만한 페이지

  • 소인수 분해 알고리즘 - 쇼어 알고리즘
    쇼어 알고리즘은 소인수분해 및 이산 로그 문제를 해결하는 양자 알고리즘으로, 양자 위상 추정 알고리즘과 연분수 알고리즘을 활용하며, 공개 키 암호화 방식을 깨뜨릴 수 있다.
  • 소인수 분해 알고리즘 - 연분수 소인수분해 알고리즘
    연분수 소인수분해 알고리즘은 합성수 n의 제곱근을 연분수로 전개하여 얻은 값으로 x^2 \equiv y^2 \pmod n를 만족하는 xy를 찾아 n의 약수를 구하는 알고리즘이다.
이차 체

2. 역사

일반 수체 체(NFS)가 발견되기 전까지, 이차 체(QS)는 가장 빠른 범용 인수분해 알고리즘으로 알려져 있었다. 현재는 렌스트라 타원 곡선 인수분해가 QS와 실행 시간이 같지만, QS는 다중 정밀도 연산 대신 단일 정밀도 연산을 사용하므로 실제로는 더 빠르다.[3]

1994년 4월 2일, RSA-129의 인수분해가 QS를 사용하여 완료되었다. RSA-129는 129자리의 숫자였으며, 64자리와 65자리의 두 개의 큰 소수의 곱이었다. 이 인수분해의 인수 기저는 524339개의 소수를 포함했다. 데이터 수집 단계는 인터넷을 통해 분산 방식으로 5000 MIPS-년이 소요되었으며, 수집된 데이터는 총 2GB였다. 데이터 처리 단계는 Bellcore(현재 Telcordia Technologies)의 MasPar (대규모 병렬) 슈퍼컴퓨터에서 45시간이 걸렸다. 이는 1996년 4월 10일에 NFS를 사용하여 RSA-130을 인수분해하기 전까지 범용 알고리즘으로 수행된 가장 큰 인수분해였다. 그 이후로 인수분해된 모든 RSA 숫자는 NFS를 사용하여 인수분해되었다.[3]

현재 QS 인수분해 기록은 2020년 6월에 패트릭 콘서가 약 6,000 코어 시간 동안 6일 동안 사용하여 인수분해한 140자리(463비트) RSA-140이다.[3]

3. 기본 원리

이 알고리즘은 x^2 \equiv y^2 \pmod n 이고, (x+y,n)(x-y,n)1이나 n과 같지 않다면, n=(x+y,n) \cdot (x-y,n)인 점을 이용한다.[2] ''n''을 인수분해하기 위해 제곱 합동 모듈러 연산을 이용하며, 두 단계로 작동한다.

1. 데이터 수집 단계: 제곱 합동으로 이어질 수 있는 정보를 수집한다.

2. 데이터 처리 단계: 수집된 데이터를 행렬에 넣고 해를 구하여 제곱 합동을 얻는다.

데이터 수집 단계는 여러 프로세서에서 병렬 컴퓨팅이 가능하지만, 데이터 처리 단계는 많은 메모리가 필요하여 여러 노드에서 효율적으로 병렬화하기 어렵다. 각 처리 노드가 전체 행렬을 저장할 만큼 충분한 메모리가 없는 경우에도 마찬가지이다. 블록 비데만 알고리즘은 각 시스템이 행렬을 보관할 수 있는 소수의 시스템에서 사용 가능하다.

제곱 합동을 찾는 간단한 방법은 임의의 숫자를 제곱하고 ''n''으로 나누어 가장 작은 음이 아닌 나머지가 제곱수가 되기를 기대하는 것이다. (예: 80^2 \equiv 441 = 21^2 \pmod{5959}). 이 방법은 큰 ''n''에서는 제곱 합동을 찾기 어렵지만, 찾으면 대부분 비자명하며 인수분해가 완료된다. 이는 페르마 인수분해법의 기본 원리이다.

제곱 체는 딕슨 인수분해법을 개선한 것이다. 페르마 방법은 ''a''2을 ''n''으로 나눈 나머지가 제곱수인 ''a''를 찾는 것이 어렵지만, 이차 체는 여러 ''a''에 대해 ''a''2/''n''의 나머지를 계산하고 그 곱이 제곱수가 되는 부분 집합을 찾는다.

예를 들어 1649를 소인수분해하면 다음과 같다.

:41^2 \equiv 32, 42^2 \equiv 115, 43^2 \equiv 200 \pmod{1649}

32, 115, 200 중 제곱수는 없지만, 32 \cdot 200 = 80^2는 제곱수이다. 또한,

:32 \cdot 200 \equiv 41^2 \cdot 43^2 \equiv (41 \cdot 43)^2 \equiv 114^2 \pmod{1649}

:41 \cdot 43 \equiv 114 \pmod{1649}

32 \cdot 200 = 80^2는 제곱 합동을 의미한다.

:114^2 \equiv 80^2 \pmod{1649}

114^2 - 80^2 = (114 + 80) \cdot (114 - 80) = 194 \cdot 34 = k \cdot 1649 (k는 정수) 이므로,

: 1649 = \gcd( 194, 1649 ) \cdot \gcd( 34, 1649 ) = 97 \cdot 17

유클리드 호제법으로 최대 공약수를 계산한다.

주어진 정수 집합에서 곱이 제곱수가 되는 부분 집합을 찾는 것이 중요하다. 산술의 기본 정리에 의해 모든 양의 정수는 소수 거듭제곱의 곱으로 유일하게 표현된다. 예를 들어 504는 23325071로 표현되며, 지수 벡터는 (3,2,0,1)이다. 두 정수를 곱하면 해당 지수 벡터를 더한다. 지수 벡터의 모든 좌표가 짝수이면 제곱수이다. (3,2,0,1) + (1,0,0,1) = (4,2,0,2)이므로 (504)(14)는 제곱수이다. 제곱수를 찾기 위해 벡터의 패리티만 고려하여 mod 2로 계산한다. (1,0,0,1) + (1,0,0,1) = (0,0,0,0)이므로, (0,1)-벡터 집합에서 영벡터 mod 2로 더해지는 부분 집합을 찾는다.

\mathbb{Z}/2\mathbb{Z}는 2차 갈루아 체이므로, mod 2 계산에서 0이 아닌 숫자(1)로 나눌 수 있어 선형 대수 문제로 볼 수 있다. 선형 대수 정리에 의해 각 벡터가 항목보다 많으면 선형 종속성이 존재하며, 가우스 소거법으로 찾을 수 있다.

많은 임의의 숫자를 mod ''n''으로 제곱하면 다양한 소수 인수가 생성되어 긴 벡터와 큰 행렬이 생긴다. ''a''2 mod ''n''이 작은 소수 인수를 갖는 ''a''(매끄러운 수)를 찾는 것이 중요하다. 매끄러운 숫자만 사용하면 벡터와 행렬이 작아진다. 이차 체는 체론을 사용하여 매끄러운 숫자를 찾는다.

4. 알고리즘

이차 체 알고리즘은 x^2 \equiv y^2 \pmod n 형태의 합동식을 찾아, n = \gcd(x+y, n) \cdot \gcd(x-y, n)으로 소인수분해하는 방법이다.[2] 이 알고리즘은 딕슨 인수분해법을 개선한 것이다. 실행 시간은 다음과 같다.

:O\left(e^\sqrt{\log n \log\log n}\right)=L_n\left[{1 \over2},1\right]

알고리즘의 핵심 아이디어는 다음과 같다.

1. y(x) = (\lfloor \sqrt{n} \rfloor + x)^2 - n 함수를 정의한다. (이 함수는 변경될 수 있다.)

2. x^2 \equiv p \pmod n인 소수 ''p'' (제곱잉여)들을 찾는다.

3. x^2 \equiv n \pmod p를 만족하는 ''x''를 찾는다.

4. 행렬 등을 이용해 완전제곱수가 되는 곱을 찾고, 이들을 곱해 완전제곱꼴로 만든다.

5. gcd(x+y, n)와 gcd(x-y, n)을 계산하여 ''n''의 약수를 구한다.
N=667 소인수분해 예시:1. p값: 야코비 기호를 이용하여 \left(\frac{N}{p}\right) = 1을 만족하는 p = 2, 3, 7을 찾는다.

2. 범위: \lfloor \sqrt{667} \rfloor \pm 8 = 17, 33 범위를 설정한다.

3. p-smooth 확인: (정수)2-667이 2, 3, 7로만 소인수분해되는지 확인한다. (자세한 과정은 하위 섹션의 표 참고)

4. 행렬: p-smooth인 n값에 대해 p로 나누어지는 횟수를 나타내는 행렬을 만들고, 2로 나눈 나머지를 계산한 후 전치행렬을 구한다.

5. v 행렬: 전치 행렬과 곱했을 때 영벡터가 되는 행렬 vT를 찾고, 전치하여 v를 구한다.

6. x, y: v에서 1인 성분에 대응하는 n 값으로 x, y를 계산한다.

7. 소인수분해: gcd(x-y, N), gcd(x+y, N)을 계산하여 667 = 23 ⋅ 29를 얻는다.
참고:


  • 작은 수에는 폴라드 로 알고리즘 등 다른 알고리즘이 더 효율적이다.
  • 이차 체는 50자리 이상, 약수가 2개인 수에 주로 사용된다.
  • 데이터 수집 단계는 병렬 컴퓨팅이 가능하지만, 데이터 처리 단계는 메모리 요구량이 크고 병렬화가 어렵다. 블록 비데만 알고리즘이 사용될 수 있다.
  • 페르마 인수분해법은 단일 숫자 a를 찾는 반면, 이차 체는 여러 a에 대해 a2/n의 나머지를 계산하고 곱이 제곱수가 되는 부분 집합을 찾는다.

4. 1. 1. 매끄러움 경계(Smoothness Bound) 설정

매끄러움 경계 ''B''를 선택한다. ''B''보다 작은 소수의 개수를 나타내는 π(''B'')는 벡터의 길이와 필요한 벡터의 개수를 모두 제어한다.[1]

4. 2. 2. 데이터 수집 (체질 단계)

N=667을 소인수분해하는 예시에서, 이차 체 알고리즘의 데이터 수집(체질 단계)은 다음과 같다.

  • p의 값을 구하기 위해 먼저 다음 식을 계산한다.

:\lceil\ln(\lceil \sqrt{667} \rceil^{2}-667)\rceil=3
:\left ( \frac{N}{p} \right )=1

  • 위의 식을 만족하는 p는 2, 3, 7이다. N이 홀수이면 p에는 2가 항상 포함된다.


이차 체의 범위를 정한다. 667과 같이 작은 수를 소인수분해할 때는 위아래로 8개의 수 정도만 고려해도 충분하다.

  • n의 값의 범위는 아래 표와 같이 17부터 33까지이다.
  • 이 범위는 \lfloor \sqrt{667} \rfloor \pm8=17, 33으로 계산된다.
  • 이 범위는 수의 크기에 따라 달라진다.


2번에서 구한 범위 내의 정수에 대해 (정수의 값)2-N의 값이 p의 값들(2, 3, 7)로만 완전히 소인수분해되는지 확인한다.

  • (정수의 값)2-N이 p-smooth인지 확인하는 과정이다.
  • p의 값들로만 완전히 소인수분해되는 정수들을 모은다.
  • 실제로 (정수)2-N을 완전히 소인수분해할 필요는 없고, 2, 3, 7로 계속 나누어 본다.
  • 계속 나눠서 1이 되면, 이 수는 p의 값들로 완전히 소인수분해되는 것이다.
  • 더 이상 나눌 수 없는데 1보다 크면, 이 수는 p의 값들로 완전히 소인수분해되지 않는 것이다.


이 과정을 표로 나타내면 다음과 같다.

이차 체
xrnn2-N (n2-667)2로 나누어지는 횟수3으로 나누어지는 횟수7로 나누어지는 횟수2, 3, 7로 완전히 소인수분해가 되는가?
x117-378131
x218-343003
x319-306120아니오
x420-267010아니오
x521-226100아니오
x622-183010아니오
x723-138110아니오
x824-91001아니오
x925-42111
x10269020
x112762100아니오
x1228117020아니오
x1329174110아니오
x1430233000아니오
x1531294112
x1632357011아니오
x1733422100아니오


4. 3. 3. 데이터 처리 (행렬 처리 단계)

3단계에서는 2단계에서 정한 범위 내의 정수들에 대해 (정수의 값)2-N이 p의 값들(2, 3, 7)로만 완전히 소인수분해되는지, 즉 (정수의 값)2-N이 p-smooth인지 확인한다. 이 과정에서는 (정수)2-N을 완전히 소인수분해할 필요는 없고, 2, 3, 7로 계속 나누어 보아 더 이상 나누어떨어지지 않을 때까지 나누면 된다. 만약 계속 나누어 1이 된 경우 이 수는 p의 값들로 완전히 소인수분해되는 것이고, 그렇지 않고 1보다 큰 값이 남으면 p의 값으로 완전히 소인수분해되지 않는 것이다.

이 과정을 표로 나타내면 다음과 같다.

이차 체
xrnn2-N (n2-667)2로 나누어지는 횟수3으로 나누어지는 횟수7로 나누어지는 횟수2, 3, 7로 완전히 소인수분해가 되는가?
x117-378131
x218-343003
x319-306120아니오
x420-267010아니오
x521-226100아니오
x622-183010아니오
x723-138110아니오
x824-91001아니오
x925-42111
x10269020
x112762100아니오
x1228117020아니오
x1329174110아니오
x1430233000아니오
x1531294112
x1632357011아니오
x1733422100아니오



4단계에서는 2, 3, 7로 완전히 소인수분해되는 수의 n값(17, 18, 25, 26, 31)에 대해, p로 나누어지는 횟수들을 모은 행렬을 만든다. 그 후 행렬의 각 성분을 2로 나눈 나머지로 바꾼다.


  • 17은 (1, 3, 1)
  • 18은 (0, 0, 3)
  • 25는 (1, 1, 1)
  • 26은 (0, 2, 0)
  • 31은 (1, 1, 2)


따라서 행렬은 \begin{pmatrix} 1 & 3 & 1 \\ 0 & 0 & 3 \\ 1 & 1 & 1 \\ 0 & 2 & 0 \\ 1 & 1 & 2 \end{pmatrix}가 된다. 이 행렬의 각 성분을 2로 나눈 나머지를 모은 행렬은 \begin{pmatrix} 1 & 1 & 1 \\ 0 & 0 & 1 \\ 1 & 1 & 1 \\ 0 & 0 & 0 \\ 1 & 1 & 0 \end{pmatrix}가 된다. 그런 다음 이 행렬을 전치하면 \begin{pmatrix} 1 & 0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 & 0 \end{pmatrix}이 된다.

5단계에서는 전치한 행렬과 곱하고 각 성분을 2로 나눈 나머지로 바꿨을 때 열이 하나밖에 없는 영벡터가 나오도록 하는 행렬 '''vT'''를 구한다. 그리고 이 행렬 '''vT'''를 전치하여 행이 하나인 행렬 '''v'''를 구한다.

이 예시에서는, \begin{pmatrix} 1 & 0 & 1 & 0 & 1\\ 1 & 0 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 & 0 \end{pmatrix}\cdot v^{T}=\begin{pmatrix} 0 \\ 0 \\ 0 \end{pmatrix} \pmod 2를 만족하는 v^{T}를 구하면 \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}이 된다. 여기서 '''vT'''는 여러 개가 될 수 있다. 이제 이 행렬을 전치하면 v = \begin{pmatrix} 0 & 0 & 0 & 1 & 0 \\ \end{pmatrix}이 된다.

4. 4. 4. 제곱근 계산 및 최대공약수 계산

이차 체 알고리즘은 제곱근 계산 및 최대공약수 계산을 활용하여 소인수분해를 수행한다. 구체적인 작동 방식은 다음과 같다.

1. 함수 정의:

  • y(x)=(\left\lfloor\sqrt{n}\right\rfloor+x\right)^2-n 형태의 함수 y(x)를 정의한다. (이 함수는 변경될 수 있다.)


2. 제곱잉여 수집:

  • x^2 \ \equiv\ p \pmod{n}를 만족하는 소수 ''p'' (제곱잉여)를 \lceil\ln(\lceil\sqrt{x}\rceil^2-x)\rceil개 수집한다.


3. x 값 계산:

  • x^2 \ \equiv\ n \pmod{p}를 만족하는 자연수 ''x''를 찾는다.


4. 완전제곱수 만들기:

  • 행렬 또는 방정식을 이용하여 완전제곱수가 되는 곱을 찾는다.
  • 찾은 곱들을 곱하여 완전제곱꼴로 만든다.


5. 최대공약수 계산:

  • gcd(x+y, n)와 gcd(x-y, n)을 계산하여 ''n''의 약수를 구한다.

예시 (N=667):1. p 값 구하기:

  • \lceil\ln(\lceil \sqrt{667} \rceil^{2}-667)\rceil=3개의 p를 구한다.
  • \left ( \frac{N}{p} \right )=1 (야코비 기호)를 만족하는 p는 2, 3, 7이다. (N이 홀수이면 p는 항상 2를 포함한다.)


2. 이차 체 범위 설정:

  • \lfloor \sqrt{667} \rfloor \pm8=17, 33 범위를 설정한다. (범위는 수의 크기에 따라 달라진다.)


3. p-smooth 확인:

  • 범위 내 정수들의 제곱에서 N을 뺀 값((정수)2-N)이 2, 3, 7로만 소인수분해되는지 확인한다.
  • 2, 3, 7로 계속 나누어 1이 되면 p-smooth이고, 1보다 큰 값이 남으면 p-smooth가 아니다.


이차 체 (N=667)
xrnn2-6672로 나누어지는 횟수3으로 나누어지는 횟수7로 나누어지는 횟수2, 3, 7로 완전히 소인수분해가 되는가?
x117-378131
x218-343003
x319-306120아니오
x420-267010아니오
x521-226100아니오
x622-183010아니오
x723-138110아니오
x824-91001아니오
x925-42111
x10269020
x112762100아니오
x1228117020아니오
x1329174110아니오
x1430233000아니오
x1531294112
x1632357011아니오
x1733422100아니오



4. 행렬 생성 및 전치:


  • p-smooth인 n값에 대해 p로 나누어지는 횟수를 나타내는 행렬을 만든다.
  • 각 성분을 2로 나눈 나머지로 바꾼 후 전치행렬을 구한다.
  • 예시:
  • 초기 행렬: \begin{pmatrix} 1 & 3 & 1 \\ 0 & 0 & 3 \\ 1 & 1 & 1 \\ 0 & 2 & 0 \\ 1 & 1 & 2 \end{pmatrix}
  • 2로 나눈 나머지: \begin{pmatrix} 1 & 1 & 1 \\ 0 & 0 & 1 \\ 1 & 1 & 1 \\ 0 & 0 & 0 \\ 1 & 1 & 0 \end{pmatrix}
  • 전치 행렬: \begin{pmatrix} 1 & 0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 & 0 \end{pmatrix}


5. v 행렬 계산:

  • 전치 행렬과 곱했을 때 열이 하나뿐인 제로벡터가 되는 행렬 '''vT'''를 구한다.
  • '''vT'''를 전치하여 행이 하나인 행렬 '''v'''를 구한다.
  • 예시:
  • \begin{pmatrix} 1 & 0 & 1 & 0 & 1\\ 1 & 0 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 & 0 \end{pmatrix}\cdot v^{T}=\begin{pmatrix} 0 \\ 0 \\ 0 \end{pmatrix} \pmod 2
  • v^{T} = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}
  • v = \begin{pmatrix} 0 & 0 & 0 & 1 & 0 \\ \end{pmatrix}


6. x, y 값 계산:

  • '''v'''에서 1인 성분에 대응하는 n 값을 ar이라 한다.
  • x=a_1a_2a_3\cdots a_r\pmod N, y= \sqrt {(a_1^2-N)\cdot(a_2^2-N)\cdots(a_r^2-N)} 공식을 이용한다.
  • 예시: x = 26, y = 3


7. 최대공약수를 이용한 소인수분해:

  • x2≡y2 (mod N) 관계를 이용한다.
  • N의 약수는 gcd(x-y, N), gcd(x+y, N)이다.
  • N = gcd(x-y, N) ⋅ gcd(x+y, N)
  • 예시: 667 = gcd(23, 667) ⋅ gcd(29, 667) = 23 ⋅ 29

참고:

  • 작은 수(예: 667)의 소인수분해에는 이차 체 알고리즘이 비효율적이다. 폴라드 로 알고리즘, 시도 나눗셈, 폴라드의 p-1 알고리즘 등이 더 효율적이다.
  • 이차 체는 주로 50자리 이상이고 약수가 2개 있는 수를 소인수분해할 때 사용된다.

딕슨 인수분해법과의 유사성:이차 체 알고리즘은 매끄러운 수 ''Y''를 찾아 Y \equiv Z^2 \pmod{N}를 만족시키는 성질을 이용한다는 점에서 딕슨 인수분해법과 유사하다. 이후 과정은 딕슨 인수분해법의 변형과 동일하게 진행된다.
예시 (15347):

  • 방정식의 곱의 지수를 행렬로 표현 (mod 2):


\begin{align}

29 &= 2^0 \cdot 17^0 \cdot 23^0 \cdot 29^1 \\

782 &= 2^1 \cdot 17^1 \cdot 23^1 \cdot 29^0 \\

22678 &= 2^1 \cdot 17^1 \cdot 23^1 \cdot 29^1 \\

\end{align}



:

S \cdot \begin{bmatrix} 0 & 0 & 0 & 1 \\ 1 & 1 & 1 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} \equiv \begin{bmatrix} 0 & 0 & 0 & 0 \end{bmatrix} \pmod{2}

  • 왼쪽 영공간을 이용하여 해를 구함: S = \begin{bmatrix}1 & 1 & 1 \end{bmatrix}
  • 세 방정식의 곱은 제곱(mod N): 29 \cdot 782 \cdot 22678 = 22678^2
  • 124^2 \cdot 127^2 \cdot 195^2 = 3070860^2
  • 22678^2 \equiv 3070860^2 \pmod{15347}
  • GCD(3070860 - 22678, 15347) = 103 (15347의 자명하지 않은 인수), 다른 하나는 149.


이 예시는 이차 체가 작은 수에는 비효율적임을 보여준다.

5. 최적화 기법

이차 체는 ''x''2 ≡ ''y''2 (mod ''n'')보다 훨씬 약한 조건을 만족하는 정수 쌍 ''x''와 ''y''(''x'')를 찾는다. 여기서 ''y''(''x'')는 ''x''의 함수이다. 이 알고리즘은 '인수 기저'라고 하는 소수 집합을 선택하고, ''y''(''x'') = ''x''2 mod ''n''의 최소 절대 나머지가 인수 기저에서 완전히 인수분해되는 ''x''를 찾으려고 시도한다. 이러한 ''y'' 값은 인수 기저에 대해 '부드럽다'고 한다.

인수 기저에서 분해되는 ''y''(''x'') 값의 인수분해는 ''x'' 값과 함께 '관계'라고 한다. 이차 체는 ''x''를 √''n''에 가깝게 하여 관계를 찾는 과정을 가속화한다. 이렇게 하면 ''y''(''x'')가 작아져 부드러워질 가능성이 높아진다.

:y(x)=\left(\left\lceil\sqrt{n}\right\rceil+x\right)^2-n\hbox{ (여기서 }x\hbox{는 작은 정수)}

:y(x)\approx 2x\left\lceil\sqrt{n}\right\rceil

이는 ''y''가 2''x''''n''의 차수임을 의미한다. 그러나 ''y''가 √''n''에 ''x''를 곱한 값에 비례하여 선형적으로 증가한다는 의미이기도 하다.

부드러움을 증가시키는 또 다른 방법은 단순히 인수 기저의 크기를 늘리는 것이다. 그러나 선형 종속성의 존재를 보장하려면 인수 기저의 소수 개수보다 최소한 하나 이상의 부드러운 관계를 찾아야 한다.

5. 1. 다중 다항식 (Multiple Polynomials)

실제로, ''y''에 대해 여러 다항식을 사용한다. ''y''(''x'')가 커져서 부드러운 ''y''의 밀도가 낮아지면, 다항식을 전환하여 이러한 성장을 재설정할 수 있다. 일반적으로 ''y''(''x'')를 모듈로 ''n''의 제곱으로 선택하지만, 이제는 다음과 같은 형태를 갖는다.

: y(x)=(Ax+B)^2-n \qquad A,B\in\mathbb{Z}.

BB^2 = n \pmod A가 되도록 선택되며, 따라서 B^2 - n = AC이다. 여기서 C는 어떤 상수이다. 그러면 다항식 y(x)는 y(x) = A\cdot(Ax^2 + 2Bx + C)로 쓸 수 있다. 만약 ''A''가 제곱수이거나 스무스 수라면, (Ax^2 + 2Bx + C) 인수만 스무스함을 확인하면 된다.

이 방식은 여러 다항식 이차 체(MPQS)라고 불리며, 각 병렬화에 이상적으로 적합하다. 왜냐하면 소인수 분해에 참여하는 각 프로세서에게 ''n'', 인수 기반 및 다항식 모음을 제공할 수 있으며, 다항식으로 체질을 완료할 때까지 중앙 프로세서와 통신할 필요가 없기 때문이다.[1]

실제 구현의 현실적인 예시에 대한 전형적인 매개변수 선택을 설명하기 위해, 다항식과 큰 소수 최적화를 포함하여, [http://sourceforge.net/projects/msieve/ msieve] 도구를 267비트 반소수에 대해 실행하여 다음 매개변수를 생성했다.[1]

매개변수
시험 인수분해 컷오프27비트
체 간격(다항식당)393216 (크기 32768의 12 블록)
평활도 경계1300967 (50294개의 소수)
다항식 A 계수에 대한 인수 수10 (위 다중 다항식 참조)
큰 소수 경계128795733 (26비트) (위 큰 소수 참조)
발견된 평활 값체질을 통해 직접 25952개, 큰 소수를 사용하여 숫자 결합으로 24462개
최종 행렬 크기50294 × 50414, 필터링을 통해 35750 × 35862로 축소
발견된 비자명 종속성15
총 시간(1.6 GHz UltraSPARC III에서)35분 39초
최대 사용 메모리8MB


5. 2. 큰 소수 변형 (Large Prime Variation)

''y''(''x'')가 매끄럽지 않더라도, 두 개의 ''y''가 소인수 기저 밖에서 동일한 소수의 곱인 경우 이러한 ''부분 관계'' 두 개를 병합하여 완전한 관계를 형성할 수 있다. 이것은 소인수 기저를 확장하는 것과 동일하다. 예를 들어 소인수 기저가 {2, 3, 5, 7}이고 ''n'' = 91인 경우 다음과 같은 부분 관계가 존재한다.

:{21^2\equiv 7^1\cdot 11\pmod{91}}

:{29^2\equiv 2^1\cdot 11\pmod{91}}

이들을 곱하면 다음과 같다.

:{(21\cdot 29)^2\equiv2^1\cdot7^1\cdot11^2\pmod{91}}

그리고 양변에 (11−1)2를 곱한다. 91을 모듈로 한 11−1은 58이므로 다음과 같다.

:(58\cdot 21\cdot 29)^2\equiv 2^1\cdot7^1\pmod{91}

:14^2\equiv 2^1\cdot7^1\pmod{91}

완전한 관계를 생성한다. 이러한 완전한 관계(부분 관계를 결합하여 얻음)를 ''사이클''이라고 한다. 때로는 두 개의 부분 관계에서 사이클을 형성하면 직접적으로 제곱 합동식으로 이어지지만, 드물게 발생한다.

만약 ''A''보다 작은 모든 인수로 나눈 후, 숫자의 나머지 부분(코팩터)이 ''A''2보다 작다면, 이 코팩터는 소수여야 한다. 사실상, 관계 목록을 코팩터별로 정렬하여 인자 기반에 추가할 수 있다. 만약 y(a) = 7*11*23*137이고 y(b) = 3*5*7*137이라면, y(a)y(b) = 3*5*11*23 * 72 * 1372이다. 이는 전체 인수 분해가 수행되는 체질 배열의 항목 임계값을 줄임으로써 작동한다.

임계값을 더욱 낮추고, y(x) 값을 비교적 큰 소수의 곱으로 인수분해하는 효과적인 프로세스를 사용하면(ECM이 이에 탁월함), 인수가 대부분 인수로 구성된 관계를 찾을 수 있지만, 두 개 또는 세 개의 더 큰 소수를 갖는 관계를 찾을 수 있다. 그 후 사이클 찾기를 통해 여러 소수를 공유하는 일련의 관계를 단일 관계로 결합할 수 있다.

실제 구현의 현실적인 예시에 대한 전형적인 매개변수 선택을 설명하기 위해, 다항식과 큰 소수 최적화를 포함하여, [http://sourceforge.net/projects/msieve/ msieve] 도구를 267비트 반소수에 대해 실행하여 다음 매개변수를 생성했다.

매개변수
시험 인수분해 컷오프27비트
체 간격(다항식당)393216 (크기 32768의 12 블록)
평활도 경계1300967 (50294개의 소수)
다항식 A 계수에 대한 인수 수10 (다중 다항식 참조)
큰 소수 경계128795733 (26비트) (큰 소수 참조)
발견된 평활 값체질을 통해 직접 25952개, 큰 소수를 사용하여 숫자 결합으로 24462개
최종 행렬 크기50294 × 50414, 필터링을 통해 35750 × 35862로 축소
발견된 비자명 종속성15
총 시간(1.6 GHz UltraSPARC III에서)35분 39초
최대 사용 메모리8MB


6. 활용

이차 체 알고리즘은 발견 당시 다른 알고리즘들에 비해 매우 빨라 큰 수를 소인수분해할 때 많이 쓰였다. 요즘에는 렌스트라의 타원곡선 알고리즘 (ECM)으로 특정 크기 미만의 약수들을 모두 구하고, 약수가 2개밖에 없는 것이 확인되거나 2개가 될 때까지 나눈 후 이 알고리즘을 적용한다. 보통 두 약수의 크기가 비슷할 때 잘 작동하며, 100자리 이상의 정수를 소인수분해할 때에는 수체 체 (GNFS) 알고리즘을 더 많이 사용한다.[3]

일반 수체 체 (NFS)가 발견되기 전까지, QS는 점근적으로 가장 빠른 범용 인수분해 알고리즘으로 알려져 있었다. 현재, 렌스트라 타원 곡선 인수분해는 QS와 동일한 점근적 실행 시간을 갖지만, QS가 단일 정밀도 연산을 사용하기 때문에 실제로는 더 빠르다.[3]

1994년 4월 2일, RSA-129의 인수분해가 QS를 사용하여 완료되었다. 이는 129자리 숫자였으며, 64자리와 65자리의 두 개의 큰 소수의 곱이었다. 데이터 수집 단계는 인터넷을 통해 분산 방식으로 5000 MIPS-년이 소요되었고, 데이터 처리 단계는 Bellcore(현재 Telcordia Technologies)의 MasPar 슈퍼컴퓨터에서 45시간이 걸렸다. 이는 1996년 4월 10일에 NFS를 사용하여 RSA-130을 인수분해하기 전까지 범용 알고리즘으로 수행된 가장 큰 인수분해였다.[3]

현재 QS 인수분해 기록은 2020년 6월에 패트릭 콘서가 약 6,000 코어 시간 동안 6일 동안 사용하여 인수분해한 140자리(463비트) RSA-140이다.[3]

이차 체 알고리즘의 다양한 구현체는 다음과 같다.

구현체설명
[http://www.asahi-net.or.jp/~KC2H-MSM/cn PPMPQS 및 PPSIQS]
[http://gforge.inria.fr/projects/mpqs/ mpqs]
[http://www.friedspace.com/QS/ SIMPQS]William Hart가 작성한 자기 초기화 다중 다항식 이차 체의 빠른 구현체
[http://www.alpertron.com.ar/ECM.HTM Dario Alpern의 인수분해 애플릿]특정 조건이 충족되면 이차 체를 사용
PARI/GP대형 소수 변형을 구현하는 자기 초기화 다중 다항식 이차 체의 구현을 포함
MAGMA이차 체의 변형 사용 가능
[http://sourceforge.net/projects/msieve/ msieve]Jason Papadopoulos가 작성한 다중 다항식 이차 체의 구현체
[https://github.com/bbuhrow/yafu YAFU]Ben Buhrow가 작성, 사용 가능한 이차 체 구현체 중 가장 빠름
[http://sourceforge.net/projects/arielqs/ Ariel]교육 목적으로 사용하기 위한 간단한 Java 이차 체 구현체
[https://github.com/TilmanNeumann/java-math-library java-math-library]Java로 작성된 가장 빠른 이차 체를 포함
[https://github.com/gazman-sdk/quadratic-sieve Java QS]QS의 기본 구현을 포함하는 오픈 소스 Java 프로젝트
[https://github.com/michel-leonard/C-Quadratic-Sieve C Quadratic Sieve]자기 초기화 이차 체 구현을 포함하는 C로 작성된 인수분해기
[https://cran.r-project.org/package=RcppBigIntAlgos RcppBigIntAlgos]R 프로그래밍 언어용 다중 다항식 이차 체의 효율적인 구현 제공


7. 한계

렌스트라 타원 곡선 인수분해는 이차 체(QS)와 점근적 실행 시간이 동일하지만(n이 동일한 크기의 소수 인수를 정확히 두 개 갖는 경우), 실제로는 QS가 더 빠르다. 왜냐하면 QS는 타원 곡선 방법에서 사용되는 다중 정밀도 연산 대신 단일 정밀도 연산을 사용하기 때문이다.[3]

1994년 4월 2일, RSA-129의 인수분해가 QS를 사용하여 완료되었다. 이는 129자리의 숫자였으며, 64자리와 65자리의 두 개의 큰 소수의 곱이었다. 이 인수분해의 인수 기저는 524339개의 소수를 포함했다. 데이터 수집 단계는 인터넷을 통해 분산 방식으로 5000 MIPS-년이 소요되었고, 수집된 데이터는 총 2GB였다. 데이터 처리 단계는 Bellcore(현재 Telcordia Technologies)의 MasPar (대규모 병렬) 슈퍼컴퓨터에서 45시간이 걸렸다. 이는 1996년 4월 10일에 일반 수체 체(NFS)를 사용하여 RSA-130을 인수분해하기 전까지 범용 알고리즘으로 수행된 가장 큰 인수분해였다. 그 이후로 인수분해된 모든 RSA 숫자는 NFS를 사용하여 인수분해되었다.[3]

현재 QS 인수분해 기록은 2020년 6월에 패트릭 콘서가 약 6,000 코어 시간 동안 6일 동안 사용하여 인수분해한 140자리(463비트) RSA-140이다.[3]

참조

[1] 서적 Analysis and Comparison of Some Integer Factoring Algorithms Math. Centre Tract 154, Amsterdam 1982
[2] 뉴스 A Tale of Two Sieves https://www.ams.org/[...] 1996-12
[3] 웹사이트 Useless Accomplishment: RSA-140 Factorization with Quadratic Sieve - mersenneforum.org https://www.mersenne[...] 2020-07-07



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com