利用python编程实现,分别用三种方法对奇素数的素性进行判断,输入奇素数n≥3,分别利用Fermat测试,Solovay-Strassen测试、Miller-Rabin测试n是否为素数。
时间: 2024-03-10 10:46:11 浏览: 179
使用python实现素数判断
好的,这里给出 Python 的实现代码,分别使用了三种方法来判断奇素数的素性。
```python
import random
# 试除法判断素数
def is_prime_trial_division(n):
if n < 2:
return False
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
# Fermat测试判断素数
def is_prime_fermat(n, k=5):
if n < 2:
return False
if n == 2 or n == 3:
return True
for _ in range(k):
a = random.randint(2, n-2)
if pow(a, n-1, n) != 1:
return False
return True
# Solovay-Strassen测试判断素数
def legendre(a, p):
if pow(a, (p-1)//2, p) == p-1:
return -1
else:
return pow(a, (p-1)//2, p)
def is_prime_solovay_strassen(n, k=5):
if n < 2:
return False
if n == 2 or n == 3:
return True
for _ in range(k):
a = random.randint(2, n-2)
x = pow(a, (n-1)//2, n)
if x != 1 and x != n-1 and legendre(a, n) != x:
return False
return True
# Miller-Rabin测试判断素数
def is_prime_miller_rabin(n, k=5):
if n < 2:
return False
if n == 2 or n == 3:
return True
s, d = 0, n-1
while d % 2 == 0:
s += 1
d //= 2
for _ in range(k):
a = random.randint(2, n-2)
x = pow(a, d, n)
if x == 1 or x == n-1:
continue
for _ in range(s-1):
x = pow(x, 2, n)
if x == n-1:
break
else:
return False
return True
# 测试代码
n = int(input("请输入一个奇素数:"))
if is_prime_trial_division(n):
print(n, "是素数")
else:
print(n, "不是素数")
if is_prime_fermat(n):
print(n, "是素数")
else:
print(n, "不是素数")
if is_prime_solovay_strassen(n):
print(n, "是素数")
else:
print(n, "不是素数")
if is_prime_miller_rabin(n):
print(n, "是素数")
else:
print(n, "不是素数")
```
在程序中,`is_prime_trial_division` 函数使用了试除法来判断素数,`is_prime_fermat` 函数使用了 Fermat 测试,`is_prime_solovay_strassen` 函数使用了 Solovay-Strassen 测试,`is_prime_miller_rabin` 函数使用了 Miller-Rabin 测试。在测试时,可以指定测试的次数,这里默认为 5 次。
阅读全文