트라이얼 부문
Trial division![]() |
트라이얼 나눗셈은 가장 힘들지만 정수 인수분해 알고리즘 중 이해하기 쉽습니다.인수분해할 정수인 정수 n을 n보다 작은 각 숫자로 차례로 나눌 수 있는지 확인하기 위해 시행 나눗셈 테스트 뒤에 있는 필수 아이디어입니다.예를 들어, 정수 n = 12의 경우 정수 n을 나누는 숫자는 1, 2, 3, 4, 6, 12뿐입니다.이 목록에서 가장 큰 소수 거듭제곱만을 선택하면 12 = 3 × 4 = 3 × 2가2 된다.
재판 분할은 피보나치에 의해 그의 책 Liber Abaci (1202)[1]에서 처음 묘사되었다.
방법
정수 n(n은 인수분해할 정수)이 주어지면 시행분할은 n이 더 작은 숫자로 나누어질 수 있는지 체계적으로 테스트하는 것으로 구성됩니다.확실히 후보 인자는 n보다 작고, 임의의 n은 3보다 2로 나누어질 가능성이 높기 때문에 2부터 순서대로 테스트하는 것이 좋습니다.이 순서에서는, 2로 나누어지지 않는 숫자가 이미 결정되어 있는 경우, 4로 나누어지는 것을 테스트하는 것은 의미가 없습니다.또한 3과 3의 배수 등에 대해서도 마찬가지입니다.따라서 소수만을 후보 인자로 선택함으로써 노력을 줄일 수 있다.또한 시행 계수는 nscriptstyle\scriptstyle\script보다 크지 않습니다.n이 어떤 숫자 p로 나누어지면 n = p × q이고, p보다 작으면 n이 q 또는 q의 소수 인수로 나누어지는 조기에 검출되기 때문입니다.
A확실한 주요 요인들에게 덤벼들다 가능하다.그래서 P1=2, P2=3예를 들어 파이는i'th,, P3=5등 총리는그리고 마지막 소수 시험은 얼마인가?파이의 P2i+1을 가능한 요인;n, 많은 것은 평등은 파이+1은 인자 것을 의미할 것이다 가치.n까지 그러므로 2,3및 5으로 시험은 혼자 쓰기에 충분하)48뿐 아니라 25이기 때문입니다. 그 다음으로 한창 때의 제곱은 49이고, n아래=25단지 2,3에 충분합니다.n의 제곱 근,다면, 그것은 요인 및 n은 완전 제곱 통합해야 한다.
재판 호제법 재판 요인으로 연속적인 정수를 사용하여, 꼭대기 한 예는(Python으로)는 다음과 같다.
. 그렇지만 trial_division(n: int) ->. 목록.[int]: 자연수에 최적의 요인들의"""Return 목록이다.""" a = [] # 빈 목록을 준비한다. f = 2 #가능한 첫 요소이다. 하는 동안에 n > 1: #는 동안 n여전히 남아 있는 요소를... 한다면 n % f == 0: n의#나머지 f로 나눌지도 모른다 0. a.추가하다(f) # 그렇다면 n을 나눕니다.목록에 f를 추가합니다. n //= f # 그 인자를 n에서 나눕니다. 또 다른: 하지만 f가 n의 인수가 아니라면 f += 1 # f에 1을 더하고 다시 시도하십시오. 돌아가다 a # 소인수 반복 가능: 12인수 ~ 2, 3
또는 효율이 2배 향상:
방어하다 trial_division(시용판)(n: 인트) -> 목록.[인트]: a = [] 하는 동안에 n % 2 == 0: a.추가하다(2) n //= 2 f = 3 하는 동안에 f * f <=> n: 한다면 n % f == 0: a.추가하다(f) n //= f 또 다른: f += 2 한다면 n != 1: a.추가하다(n) # 홀수만 가능 돌아가다 a
이들 버전의 트라이얼 나눗셈은 n의 가능한 모든 계수를 체크하기 때문에 n의 계수가 있는 경우 n의 계수를 찾을 수 있습니다.n이 소수일 경우 이는 최대 n의 시험 계수를 의미합니다.따라서 알고리즘이 하나의 요인 n만 찾으면 n이 소수라는 증거입니다.요인이 두 개 이상 발견되면 n은 합성 정수입니다.이것을 계산적으로 더 유리한 방법으로 말하면, 만약 제곱이 n을 넘지 않는 소수가 나머지를 가지지 않고 나누면, n은 소수가 아니다.
아래는 C++ 버전입니다(f의 제곱 없음).
템플릿 < >학급 T, 학급 U> 벡터< >T> 트라이얼 디비전(U n) { 벡터< >T> v; T f; f = 2; 하는 동안에 (n % 2 == 0) { v.푸시백(f); n /= 2; } f = 3; 하는 동안에 (n % 3 == 0) { v.푸시백(f); n /= 3; } f = 5; T ac = 9, 임시직 = 16; 하다 { ac += 임시직; // 추가가 U타입의 오버플로를 일으키지 않는다고 가정합니다. 한다면 (ac > n) 브레이크.; 한다면 (n % f == 0) { v.푸시백(f); n /= f; ac -= 임시직; } 또 다른 { f += 2; 임시직 += 8; } } 하는 동안에 (1); 한다면 (n != 1) v.푸시백(n); 돌아가다 v; }
스피드
최악의 경우 트라이얼 나눗셈은 힘든 알고리즘입니다.base-2 n digit number a의 경우 2에서 시작하여 a의 제곱근까지만 동작하는 경우 알고리즘은
평가판 나눗셈는 소수점 함수(x)보다 작은 소수)를 나타냅니다.이는 소수를 후보 요인으로 얻기 위한 소수성 테스트의 오버헤드는 고려하지 않습니다.P(3512) = 32749(16비트 부호 있는 정수에 맞는 마지막 소수)와 P(6542) = 65521(16비트 부호 없는 정수)로 구성된 유용한 테이블은 클 필요가 없습니다.655372 = 4,295,098,369까지의 숫자에 대한 소수성을 테스트하기에 충분합니다.(보통 에라토스테네스의 체를 통해) 그러한 표를 준비하는 것은 많은 수치를 시험하는 경우에만 가치가 있을 것이다.대신 소수점 테스트 없이 소수점 2n 자리수 a의 제곱근보다 작은 모든 홀수로 단순히 나누면 소수점 여부에 관계없이 최대 약 다음과 같은 시간이 소요될 수 있습니다.
어느 경우든 필요한 시간은 숫자의 자릿수에 따라 기하급수적으로 증가합니다.
가장 잘 알려진 알고리즘도 시간이 기하급수적으로 증가한다는 점을 고려하면 이 방법은 매우 만족스러운 방법입니다.주어진 길이의 정수에서 랜덤으로 균일하게 선택한 경우 2가 a의 인수일 확률이 50%이고 3이 a의 인수일 확률은 33%입니다.모든 양의 정수의 88%가 100보다 작은 인자를 가지고 92%가 1000보다 작은 인자를 가지고 있음을 알 수 있습니다.따라서 임의의 큰 a에 직면할 경우, 작은 소수점( n { n의 으로 나눗셈 여부를 확인하는 것이 좋습니다.
그러나 작은 소수점에 요인이 없는 여러 자리 숫자는 시행 구분에 인수하는 데 며칠 또는 몇 달이 걸릴 수 있습니다.이 경우 2차 체 및 일반 번호 필드 체(GNFS)와 같은 다른 방법을 사용한다.이 방법들은 또한 초다항 시간 성장을 가지고 있기 때문에 n자리수의 실질적인 한계에 매우 빠르게 도달한다.이 때문에 공개키 암호학에서 a의 값은 유사한 크기의 큰 소인수를 가지도록 선택되므로 이용 가능한 컴퓨터 시스템 또는 컴퓨터 클러스터(슈퍼컴퓨터나 컴퓨터 그리드 등)에서 유용한 시간 내에 공개적으로 알려진 어떤 방법으로도 인수인수할 수 없다.지금까지 고려된 가장 큰 암호화 등급 번호는 GNFS와 여러 슈퍼컴퓨터의 리소스를 사용하는 250자리 숫자인 RSA-250입니다.상영시간은 2700코어였습니다.
레퍼런스
- ^ Mollin, Richard A. (2002). "A brief history of factoring and primality testing B. C. (before computers)". Mathematics Magazine. 75 (1): 18–29. doi:10.2307/3219180. MR 2107288.
- Childs, Lindsay N. (2009). A concrete introduction to higher algebra. Undergraduate Texts in Mathematics (3rd ed.). New York, NY: Springer-Verlag. ISBN 978-0-387-74527-5. Zbl 1165.00002.
- Crandall, Richard; Pomerance, Carl (2005). Prime numbers. A computational perspective (2nd ed.). New York, NY: Springer-Verlag. ISBN 0-387-25282-7. Zbl 1088.11001.
외부 링크
Wikdiversity는 Python과의 트라이얼 디비전을 사용하여 소인수 분해에 대한 레슨을 제공합니다.
- 트라이얼 나눗셈을 사용한 고속 JavaScript 프라임 팩터 계산기.최대53 2개의 숫자를 처리할 수 있습니다.
- Java, C 및 JavaScript 시용판 부문 (포르투갈어)