Написал для поиска простых чисел, пока не решил, куда всерьёз можно приткнуть, и не знаю, можно ли его еще как-то ускорить (переписать с использованием NumPy, к примеру, я просто не знаком особо с ним)
Алгоритм Миллера-Рабина (Python 3.2.1)
#! /usr/local/bin/python3.2
from random import randint
from math import log, floor
import time
def to_reversed_binary(n):
r = []
while n > 0:
r.append(n & 1)
n //= 2
return r
def test(a, n):
"""
test(a, n) -> bool. Tests whether n is complex.
Returns:
- True, if n is complex.
- False, if n is probably prime.
"""
b = to_reversed_binary(n - 1)
k = 1
for i in range(len(b) - 1, -1, -1):
x = k
k = (k * k) % n
if k == 1 and x != 1 and x != n - 1:
return True #Complex
if b[i] == 1:
k = (k * a) % n
if k != 1:
return True #Complex
return False #Probably prime
def milrab(n):
"""
milrab(n) -> bool Checks whether n is prime or not
Returns:
- True, if n is probably prime.
- False, if n is complex.
"""
if n == 1:
return False
s = int(floor(log(n, 2)))
for j in range(1, s + 1):
a = randint(1, n - 1)
if test(a, n):
return False #n is complex
return True #n is probably prime
Тест:
start = time.time()
print (milrab(4113101149215104800030529537915953170486139623539759933135949994882770404074832568499))
print ('In {0} seconds'.format(time.time() - start))
Output:
True
In 0.6012141704559326 seconds
Число и правда простое, взято из какой-то последовательности.