다른 뜻에 대해서는 이차 수체 문서를 참고하십시오.
**이차 체**(Quadratic sieve, QS)는 어떤 큰 자연수 N을 소인수분해하기 위해 사용되는 소인수 분해 알고리즘으로, 양자컴퓨터가 상용화되었을 때 기준으로는 현재까지 발견된 알고리즘 중에서 3번째(쇼어 알고리즘, 수체 체 (General number field sieve))로 빠른 알고리즘이며 (양자컴퓨터를 제외하면 2번째), 수체 체의 기본이 되어 수체 체보다 더 간단한 알고리즘이다.

기본
--

이 알고리즘은 {\displaystyle x^{2}=y^{2}(mod\ n)}이고, {\displaystyle (x+y,n)}와 {\displaystyle (x-y,n)}이 1이나 n과 같지 않다면, {\displaystyle n=(x+y,n)\*(x-y,n)}
인 것을 개선한 것이다.

n에 대한 소인수 분해 시간은 다음과 같다.
{\displaystyle O\left(e^{\sqrt {\log n\log \log n}}\right)=L\_{n}\left[{1 \over 2},1\right]}

알고리즘
----

이 알고리즘은 다음과 같이 진행된다.
y(x)=\left(\left\lfloor {\sqrt {n}}\right\rfloor +x\right)^{2}-n
인 함수 y(x)를 정의한다. 이때, 이 함수는 달라질 수도 있다.

그 다음, x^{2}\ \equiv \ p{\pmod {n}}인 소수 *p* (제곱잉여)를 {\displaystyle \lceil \ln(\lceil {\sqrt {x}}\rceil ^{2}-x)\rceil }개 모은다.

그 다음, x^{2}\ \equiv \ n{\pmod {p}}를 만족하는 자연수 *x*를 구한다.

그 다음, 행렬이나 방정식을 이용하여 완전제곱수가 되게 하는 곱을 구한다. 그리고 그것들을 곱해 완전제곱꼴이 되도록 한 후 gcd(x+y, n), gcd(x-y, n)을 구하면 된다.

예시
--

1. N=667을 소인수분해하고 싶다고 하자. 그러면, 우리는 p를 {\displaystyle \lceil \ln(\lceil {\sqrt {667}}\rceil ^{2}-667)\rceil =3}개 구해야 한다. 여기서 p는 {\displaystyle \left({\frac {N}{p}}\right)=1}라는 조건을 만족하는 소수이다. 여기서 식의 좌변의 기호는 야코비 기호이며, 이 경우에 p의 값은 2, 3, 7이 된다. 여기서 N이 홀수이면 p에는 2가 반드시 포함된다.

  

2. 이차 체의 범위를 정한다. 667처럼 작은 수를 소인수분해하는 경우에는 위-아래로 8개의 수 정도만 고려해도 충분하다. 즉, 여기서 n의 값의 범위는 밑의 표에 나오는 17부터 33까지이며, 이 범위는 {\displaystyle \lfloor {\sqrt {667}}\rfloor \pm 8=17,33}에 의해서 나온 것이다. 참고로 이 범위는 수의 크기가 커짐에 따라 많이 달라지게 된다.

  

3. 2번에서 구한 범위 내에 있는 정수에 대해 (정수의 값)2-N의 값이 p의 값들로만 완전히 소인수분해되는지, 즉 (정수의 값)2-N이 p-smooth인지 확인한다. 이 부분에서 p의 값들로만 완전히 소인수분해되는 정수들을 모은다. 실제로는 이 부분에서 (정수)2-N을 완전히 소인수분해할 필요는 없고 2, 3, 7로 계속 나누어 보아 더 이상 나누어떨어지지 않을 때까지 나누면 된다. 만약 계속 나눠 1이 된 경우 이 수는 p의 값들로 완전히 소인수분해되는 것이고, 더 이상 나눌 수 없는데 이 값이 1보다 클 경우 이 수는 p의 값으로 완전히 소인수분해되지 않는 것이다. 이 경우, 이차 체는 다음과 같이 진행된다.

이차 체| xr | n | n2-N (n2-667) | 2로 나누어지는 횟수 | 3으로 나누어지는 횟수 | 7로 나누어지는 횟수 | 2, 3, 7로 완전히 소인수분해가 되는가? |
| --- | --- | --- | --- | --- | --- | --- |
| x1 | 17 | -378 | 1 | 3 | 1 | 네 |
| x2 | 18 | -343 | 0 | 0 | 3 | 네 |
| x3 | 19 | -306 | 1 | 2 | 0 | 아니오 |
| x4 | 20 | -267 | 0 | 1 | 0 | 아니오 |
| x5 | 21 | -226 | 1 | 0 | 0 | 아니오 |
| x6 | 22 | -183 | 0 | 1 | 0 | 아니오 |
| x7 | 23 | -138 | 1 | 1 | 0 | 아니오 |
| x8 | 24 | -91 | 0 | 0 | 1 | 아니오 |
| x9 | 25 | -42 | 1 | 1 | 1 | 네 |
| x10 | 26 | 9 | 0 | 2 | 0 | 네 |
| x11 | 27 | 62 | 1 | 0 | 0 | 아니오 |
| x12 | 28 | 117 | 0 | 2 | 0 | 아니오 |
| x13 | 29 | 174 | 1 | 1 | 0 | 아니오 |
| x14 | 30 | 233 | 0 | 0 | 0 | 아니오 |
| x15 | 31 | 294 | 1 | 1 | 2 | 네 |
| x16 | 32 | 357 | 0 | 1 | 1 | 아니오 |
| x17 | 33 | 422 | 1 | 0 | 0 | 아니오 |

4. 2, 3, 7로 완전히 소인수분해되는 수의 n값에 대해, p로 나누어지는 횟수들을 모은 행렬 (위에 나와 있는 부분 중 '네'라고 있는 부분만 뽑아 모은 행렬)을 만들고 그 행렬의 각 성분에 대하여 2로 나눈 나머지로 바꾼다. 여기서 2로 나눈 나머지를 구한 행렬을 전치한 행렬을 구한다. 이 예시의 경우에는, 행렬은{\displaystyle {\begin{pmatrix}1&3&1\\0&0&3\\1&1&1\\0&2&0\\1&1&2\end{pmatrix}}}가 되며,

17은 (1, 3, 1)에, 18은 (0, 0, 3)에, ... 이런 식으로 대응한다. 이 행렬의 각 성분을 2로 나눈 나머지를 모은 행렬을 구하면 {\displaystyle {\begin{pmatrix}1&1&1\\0&0&1\\1&1&1\\0&0&0\\1&1&0\end{pmatrix}}}가 되고, 이 행렬을 전치하면 {\displaystyle {\begin{pmatrix}1&0&1&0&1\\1&0&1&0&1\\1&1&1&0&0\end{pmatrix}}}이 된다.

  

5. 전치한 행렬과 곱하고 각 성분을 2로 나눈 나머지로 바꿨을 때 열이 하나밖에 없는 제로벡터가 나오도록 하는 행렬 **vT**를 구하고, 이 행렬 **vT**를 전치하여 행이 하나인 행렬 **v**를 구한다. 이 예시의 경우, {\displaystyle {\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}}}가 되고, 이때 행렬 {\displaystyle v^{T}}를 구하면 {\displaystyle {\begin{pmatrix}0\\0\\0\\1\\0\end{pmatrix}}}이 된다. (이 부분에서, 행렬 **vT**로는 여러 행렬이 가능할 수도 있다) 이제 이 행렬을 전치하면 {\displaystyle v={\begin{pmatrix}0&0&0&1&0\\\end{pmatrix}}}이 된다. 

  

6. **v**의 성분들 중에 1인 곳들을 찾고, 그 부분에 대응하는 n의 값을 순서대로 각각 ar이라 한다. 이때, {\displaystyle x=a\_{1}a\_{2}a\_{3}\cdots a\_{r}{\pmod {N}}}, {\displaystyle y={\sqrt {(a\_{1}^{2}-N)\cdot (a\_{2}^{2}-N)\cdots (a\_{r}^{2}-N)}}}이라는 공식을 이용해서 x와 y의 값을 구한다. 이 예시의 경우, x=a1=26이 되고, y=(a12-667)1/2=(262-667)1/2=3이 된다.

  

7. 이때, x2≡y2 (mod N)이라는 관계식이 성립하게 된다. 따라서 N의 약수는 gcd(x-y, N), gcd(x+y, N)이 되며, N=gcd(x-y, N) ⋅ gcd(x+y, N)이 된다. 예시의 경우, N=667=gcd(26-3, 667) ⋅ gcd(26+3, 667)=23 ⋅ 29가 된다.

실제로 이렇게 작은 수를 소인수분해할 때에는 이차 체 알고리즘은 효율적이지 않다. 667처럼 작은 수의 경우에는 폴라드 로 알고리즘이나 직접 나누기, 또는 폴라드의 p-1 알고리즘을 더 많이 사용하며, 보통 이차 체는 50자리가 넘고 약수가 2개 있는 수를 소인수분해할 때 쓰인다.

활용
--

이차 체 알고리즘은 발견 당시에는 다른 알고리즘들에 비해서 매우 빠른 알고리즘이었기 때문에 큰 수를 소인수분해할 때 많이 쓰였으며, 요즘에는 렌스트라의 타원곡선 알고리즘 (ECM, Elliptic Curve Method)을 특정 크기 미만의 약수들을 모두 구하게 하여 약수가 2개밖에 없는 것이 확인되거나 2개가 될 때까지 나눈 후 이 알고리즘을 적용한다. 보통 두 약수의 크기가 비슷할 때 잘 작동하며, 100자리 이상의 정수를 소인수분해할 때에는 수체 체 (GNFS, General Number Field Sieve) 알고리즘을 더 많이 사용한다. 또한 RSA-129를 소인수분해할 때 이 알고리즘을 조금 더 확장하여 여러 개의 함수를 이용하는 (f(x)=x2-N 이외에 여러 함수를 사용한다) 다중 함수 이차 체 (MPQS, Multiple Polynomial Quadratic Sieve)를 사용하기도 했다.