도전은 오래전에 끝났지 만 다소 지겨워서 숫자 중 일부를 분석하려고하기로 결정했습니다.RSA Factoring Challenge를 해결하려면 어떤 시간 복잡성이 필요합니까?
처음에는 O (n) 알고리즘이 있었지만 큰 O 표기법을 연구하기로 결정했습니다.
O (n) 알고리즘과 O (2n) 알고리즘은 기본적으로 동일한 실행 시간을가집니다. O (n)과 O (4n) 알고리즘도 그렇습니다. 실제로 O (n) 및 O (cn) 알고리즘 (여기서 c는 정수)은 본질적으로 동일한 실행 시간을가집니다.
이제 O (8n) 알고리즘이 있지만 77 비트 숫자는 빠르지 않습니다.
처음 몇 개의 RSA 번호 (5-ish 분 미만)를 생성하려면 어떤 종류의 시간 복잡성이 필요합니까?
내 O (8N) 알고리즘 :
import math
num = int(input())
sq = math.sqrt(num)
if num % 2 == 0:
print(2, int(num/2))
elif sq % 1 == sq:
print(int(sq), int(sq))
else:
sq = round(sq)
a = 3
b = sq + (1 - (sq % 2))
c = ((b + 1)/2)
d = ((b + 1)/2)
c -= (1 - (c % 2))
d += (1 - (d % 2))
e = ((c + 1)/2)
f = ((c + 1)/2)
e -= (1 - (e % 2))
f += (1 - (f % 2))
g = ((d + 1)/2) + d
h = ((d + 1)/2) + d
g -= (1 - (g % 2))
h += (1 - (h % 2))
while a <= sq and num % a != 0 and b > 2 and num % b != 0 and c <= sq and num % c != 0 and d > 2 and num % d != 0 and e <= sq and num % e != 0 and f > 2 and num % f != 0 and g <= sq and num % g != 0 and h > 2 and num % h != 0:
a += 2
b -= 2
c += 2
d -= 2
e += 2
f -= 2
g += 2
h -= 2
if num % a == 0:
print(a, int(num/a))
elif num % b == 0:
print(b, int(num/b))
elif num % c == 0:
print(c, int(num/c))
elif num % d == 0:
print(d, int(num/d))
elif num % e == 0:
print(e, int(num/e))
elif num % f == 0:
print(f, int(num/f))
elif num % g == 0:
print(g, int(num/g))
elif num % h == 0:
print(h, int(num/h))
처음 : n은 무엇입니까? 일반적으로 인수로 사용할 숫자의 자릿수로 간주됩니다. 이것도 당신의 해석이라면 O (n) 알고리즘을보고 싶습니다. 둘째, O (n)은 절대 실행 시간에 대해 전혀 알려주지 않습니다. n이 다를 경우 실행 시간이 한계로 어떻게 변하는지를 알려줍니다. – Henry
@Henry 1. n은 대략 ((RSA 번호의 제곱근)/2) 2. 맞습니다. 그러나 어떤 종류의 시간 복잡성이 필요한지를 결정하는 방법이 있습니까? – Adi219
가장 기본적인 알고리즘 중 하나 인 40 비트 숫자 (즉, 12-13 진수)의 경우 작은 소수 (예 : 3 백만 미만)로 시험 분할하면 현대 하드웨어에서 1 초 이내에 요인을 찾을 수 있습니다. – Henry