스택큐힙리스트

숫자를 2개의 소수 공약수로 분해하십시오. 본문

카테고리 없음

숫자를 2개의 소수 공약수로 분해하십시오.

스택큐힙리스트 2023. 12. 25. 07:48
반응형

텔레그램 인증에 대한 요구 사항 중 하나는 지정된 숫자를 2개의 소인수로 분해하는 것입니다. 특히 P*Q = N, where N < 2^63입니다.


작은 소인수를 어떻게 찾을 수 있을까요? P < square_root(N)


나의 제안:


1) 3에서 2^31.5까지의 소수를 사전 계산하여 N mod P = 0인지 테스트합니다.


2) 소수를 테스트하기 위한 알고리즘을 찾습니다. 그러나 여전히 N mod P =0를 테스트해야 합니다.


이 경우에 적합한 소수 알고리즘이 있을까요?

답변 1

폴라드 로 알고리즘 [VB.Net]


N < 2^63 인 경우, P*Q = N을 매우 빠르게 찾습니다.


Dim rnd As New System.Random
Function 폴라드로(n As BigInteger) As BigInteger
If n Mod 2 = 0 Then Return 2
Dim x As BigInteger = rnd.Next(1, 1000)
Dim c As BigInteger = rnd.Next(1, 1000)
Dim g As BigInteger = 1
Dim y = x
While g = 1
x = ((x * x) Mod n + c) Mod n
y = ((y * y) Mod n + c) Mod n
y = ((y * y) Mod n + c) Mod n
g = gcd(BigInteger.Abs(x - y), n)
End While
Return g
End Function
Function 최대공약수(a As BigInteger, b As BigInteger) As BigInteger
Dim r As BigInteger
While b <> 0
r = a Mod b
a = b
b = r
End While
Return a
End Function

리처드 브렌트의 알고리즘 [VB.Net] 이것은 더욱 빠릅니다.

함수 Brent(n As BigInteger) As BigInteger
만약 n Mod 2 = 0 이면 2를 반환
Dim y As BigInteger = rnd.Next(1, 1000)
Dim c As BigInteger = rnd.Next(1, 1000)
Dim m As BigInteger = rnd.Next(1, 1000)
Dim g As BigInteger = 1
Dim r As BigInteger = 1
Dim q As BigInteger = 1
Dim x As BigInteger = 0
Dim ys As BigInteger = 0
반복 동안 g = 1
x = y
1부터 r까지 i에 대해
y = ((y * y) Mod n + c) Mod n
Next
Dim k = New BigInteger(0)
반복 동안 (k < r 이고 g = 1)
ys = y
1부터 BigInteger.Min(m, r - k)까지 i에 대해
y = ((y * y) Mod n + c) Mod n
q = q * (BigInteger.Abs(x - y)) Mod n
Next
g = 최대공약수(q, n)
k = k + m
End While
r = r * 2
End While
만약 g = n 이면
계속해서
ys = ((ys * ys) Mod n + c) Mod n
g = 최대공약수(BigInteger.Abs(x - ys), n)
만약 g > 1 이면
종료
End If
End While
End If
반환 g
End Function

답변 2

키워드: 숫자 분해, 소인수분해, 소수 공약수, SEO, 한국어 에세이
제목: 숫자 분해: 2개의 소수 공약수로 분해하기
서문:
숫자 분해는 수학적인 작업으로, 주어진 수를 소수의 곱으로 나타내는 과정입니다. 이 에세이에서는 숫자 분해의 한 가지 유형인 소인수분해를 다루겠습니다. 소인수분해는 숫자를 2개의 소수 공약수로 쪼개어 표현하는 것으로, 수의 특정한 특성을 파악하거나 문제를 해결하는 데 도움이 됩니다.

본문:
소인수분해는 주어진 수를 가장 작은 소수부터 시작하여 나누는 과정을 통해 이루어집니다. 이러한 방식은 수를 더 작고 간단한 소수로 변환하여 문제를 해결하는 데 도움이 됩니다. 다음은 소인수분해의 예시입니다.
예를 들어, 숫자 72를 소인수분해 해보겠습니다. 가장 작은 소수인 2로 나눌 수 있을 때까지 계속 나누어 보면 다음과 같습니다.
72 ÷ 2 = 36
36 ÷ 2 = 18
18 ÷ 2 = 9
9 ÷ 3 = 3
72는 2 x 2 x 2 x 3로 나타낼 수 있습니다. 이는 2와 3이 72의 소수 공약수라는 것을 의미합니다. 따라서, 72를 2개의 소수 공약수로 분해한 결과는 2 x 2 x 2 x 3입니다.
이러한 소인수분해는 수의 특정한 특성을 파악하고, 문제를 간단하게 해결하는 데 사용될 수 있습니다. 예를 들어, 소인수분해를 통해 소인수의 개수를 세어 소수인지 아닌지 확인할 수 있습니다. 소인수분해는 또한 최대공약수나 최소공배수를 계산하는 데에도 사용됩니다.
결론:
숫자 분해는 주어진 수를 2개의 소수 공약수로 분해하는 과정입니다. 이렇게 숫자를 소인수분해하면 문제를 더 간단하게 해결하거나 수의 특성을 파악하는 데 도움이 됩니다. 소인수분해는 최대공약수, 최소공배수 등의 계산을 포함한 다양한 수학적 문제에 활용될 수 있습니다. 숫자 분해를 통해 소수의 특징을 이해하고, 수학적 문제를 더욱 쉽게 해결할 수 있습니다.
키워드: 숫자 분해, 소인수분해, 소수 공약수, SEO, 한국어 에세이

반응형
Comments