샨크의 사각형 형태 인자화

Shanks's square forms factorization

샨크의 사각형 형태 인자화페르마의 인자화 방법의 개선으로 다니엘 샨크가 고안한 정수 인자화 방법이다.

Fermat의 방법의 성공 여부는 x (를) 찾느냐에 따라 결정되며 은 인수할 정수다.An improvement (noticed by Kraitchik) is to look for integers and such that . Finding a suitable pair does not guarantee a factorization of ,but it implies that is a factor of , and there is a good chance that the prime divisors of are distributed between these two factors, so that calculation of the greatest common divisor of - y (는) 의 비독점 인자를 제공한다

( x을(를) 만족하는, ){\을(를) 찾기 위한 실용적인 알고리즘이 샨크스에 의해 개발되었으며, 이 알고리즘은 Square Factorization 또는 SUFOF.알고리즘은 연속 분율 또는 이차적 형태로 표현될 수 있다.지금은 훨씬 더 효율적인 인자화 방법이 있지만, SUTFOF는 프로그램 가능한 계산기에서 구현될 수 있을 만큼 작다는 장점을 가지고 있다.

In 1858, the Czech mathematician Václav Šimerka used a method similar to SQUFOF to factor .[1]

알고리즘.

입력: 인수할 정수(Prime number 또는 완벽한 사각형) 및 작은 k

: N 의 비교 계수.

알고리즘:

초기화 = , Q = , = k - . }{2

반복하다

+ i + 에서도 한 사각형이 될 때까지

Initialize

반복하다

= - . 까지.

Then if is not equal to and not equal to , then is a non-trivial factor of . Otherwise try another value of .

Shanks의 방법은 시간 O( O

Stephen S. McMath는 그 정확성에 대한 증거와 함께 샨크스 방법의 수학에 대한 보다 자세한 토론을 썼다.[2]

Let = ,= }

사이클 포워드

여기서 = 완벽한 사각형이다.

역주기

여기 = = .

( )= 의 인수

N= =

구현 예

다음은 과도 연산의 오버플로 없이 64비트 이하의 부호 없는 정수에 대해 SUFOF 인자화를 수행하는 C 함수의 예다.[citation needed]

#include <내형.h> #new nelems(x) (sizeof(x) / sizeof(x)[0]))  경솔하게 굴다 인트로 곱셈을 하다[] = {1, 3, 5, 7, 11, 3*5, 3*7, 3*11, 5*7, 5*11, 7*11, 3*5*7, 3*5*11, 3*7*11, 5*7*11, 3*5*7*11};  uint64_t 스쿼포프( uint64_t N ) {     uint64_t D, , P, 프프레프, Q, 큐프레프, q, b, r, s;     uint32_t L, B, i;     s = (uint64_t)(sqrtl(N)+0.5);     만일 (s*s == N) 돌아오다 s;     을 위해 (인트로 k = 0; k < 네임즈(곱셈을 하다) && N <= UINT64_MAX/곱셈을 하다[k]; k++) {         D = 곱셈을 하다[k]*N;          = 프프레프 = P = sqrtl(D);         큐프레프 = 1;         Q = D - *;         L = 2 * sqrtl( 2*s );         B = 3 * L;         을 위해 (i = 2 ; i < B ; i++) {             b = (uint64_t)(( + P)/Q);             P = b*Q - P;             q = Q;             Q = 큐프레프 + b*(프프레프 - P);             r = (uint64_t)(sqrtl(Q)+0.5);             만일 (!(i & 1) && r*r == Q) 부숴뜨리다;             큐프레프 = q;             프프레프 = P;         };         만일 (i >= B) 계속하다;         b = (uint64_t)(( - P)/r);         프프레프 = P = b*r + P;         큐프레프 = r;         Q = (D - 프프레프*프프레프)/큐프레프;         i = 0;         하다 {             b = (uint64_t)(( + P)/Q);             프프레프 = P;             P = b*Q - P;             q = Q;             Q = 큐프레프 + b*(프프레프 - P);             큐프레프 = q;             i++;         } 하는 동안에 (P != 프프레프);         r = gcd(N, 큐프레프);         만일 (r != 1 && r != N) 돌아오다 r;     }     돌아오다 0; } 

참조

  1. ^ Lemmermeyer, F. (2013). "Václav Šimerka: quadratic forms and factorization". LMS Journal of Computation and Mathematics. 16: 118–129. doi:10.1112/S1461157013000065.
  2. ^ "Daniel Shanks' Square Forms Factorization". CiteSeerX 10.1.1.107.9984. {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)

외부 링크