import randomfrom math import gcddef legendre(a, p): if a == 0: return 0 if a == 1: return 1 if a % 2 == 0: return legendre(a // 2, p) * pow(-1, ((p * p - 1) // 8)) else: return legendre(p % a, a) * pow(-1, ((a - 1) * (p - 1) // 4))def solovay_strassen(n, k=10): if n == 2 or n == 3: return True if n < 2 or n % 2 == 0: return False for i in range(k): a = random.randint(2, n - 1) x = legendre(a, n) if x == 0 or pow(a, (n - 1) // 2, n) != x % n: return False return True
时间: 2024-04-26 17:22:48 浏览: 104
这段代码实现了 Solovay-Strassen 算法,用于判断一个数是否为质数。其中包含两个函数:
1. `legendre(a, p)`:计算勒让德符号,返回值为 1,0 或 -1。
2. `solovay_strassen(n, k=10)`:使用随机化的方式进行 k 次测试,返回值为 True 表示 n 可能是质数,False 表示 n 肯定不是质数。
具体实现细节可以参考算法的原理和相关的数学知识。
相关问题
w11-7 计算n阶勒让德多项式的值 x和n的值从键盘输入,n为整型,x为实型。 用递归方法计算 n 阶 勒让德多项式的值。 运行效果: 输入:-5,2 输出:n=-5, 但是n不能小于0。 输入:0,0.5 输出:n=0, x=0.500000时,n阶勒让德多项式的值=1.000000。 输入:1,0.5 输出:n=1, x=0.500000时,n阶勒让德多项式的值=0.500000。 输入:2,0.5 输出:n=2, x=0.500000时,n阶勒让德多项式的值=-0.125000。
好的,我了解了你的问题,以下是对应的代码实现:
```python
def legendre(n, x):
if n < 0:
print("n不能小于0!")
return
elif n == 0:
return 1
elif n == 1:
return x
else:
return ((2 * n - 1) * x * legendre(n - 1, x) - (n - 1) * legendre(n - 2, x)) / n
n = int(input("请输入n:"))
x = float(input("请输入x:"))
result = legendre(n, x)
print("n={0}, x={1:.6f}时,n阶勒让德多项式的值={2:.6f}".format(n, x, result))
```
以上代码中,我们通过递归的方式计算了 n 阶勒让德多项式的值。在输入时,我们要注意对 n 的判断,如果 n 小于 0,则直接输出错误信息。如果 n 等于 0,则返回 1。如果 n 等于 1,则返回 x。如果 n 大于 1,则按照勒让德多项式的递推公式计算出结果。最后输出结果即可。
请修改这段代码让它输出结果绘图:粒子以不同能量经过方势阱时,波函数的变化情况:import numpy as np def square_poten_well(x, N): L = 2 V0 = -1 mat_V = np.zeros((N, N)) for i, xx in enumerate(x): if abs(xx) <= L/2: mat_V[i, i] = V0 return mat_V def phi(k, x, N): return [np.exp(1.0j*k*x[i]) for i in range(N)] def Green_func(k, x, xp, N): G = np.ones((N, N), dtype=complex) for i in range(N): G[i, :] = [-1.0j / k * np.exp(1.0j*k*np.abs(x[i]-xp[j])) for j in range(N)] return G def change_of_var(node, weight, a, b, N): nop = [(b-a) * node[i] / 2.0 + (a+b) / 2.0 for i in range(N)] wp = [(b-a) / 2.0 * weight[i] for i in range(N)] return nop, wp N = 298 a = -1.5 b = 1.5 k_vec = np.arange(0.5, 6.0) x, w = np.polynomial.legendre.leggauss(N) x = (b-a)/2.0*x + (b+a)/2.0 w = (b-a)/2.0*w
以下是修改后的代码,其中添加了绘图部分:
```python
import numpy as np
import matplotlib.pyplot as plt
def square_poten_well(x, N):
L = 2
V0 = -1
mat_V = np.zeros((N, N))
for i, xx in enumerate(x):
if abs(xx) <= L/2:
mat_V[i, i] = V0
return mat_V
def phi(k, x, N):
return [np.exp(1.0j*k*x[i]) for i in range(N)]
def Green_func(k, x, xp, N):
G = np.ones((N, N), dtype=complex)
for i in range(N):
G[i, :] = [-1.0j / k * np.exp(1.0j*k*np.abs(x[i]-xp[j])) for j in range(N)]
return G
def change_of_var(node, weight, a, b, N):
nop = [(b-a) * node[i] / 2.0 + (a+b) / 2.0 for i in range(N)]
wp = [(b-a) / 2.0 * weight[i] for i in range(N)]
return nop, wp
N = 298
a = -1.5
b = 1.5
k_vec = np.arange(0.5, 6.0)
x, w = np.polynomial.legendre.leggauss(N)
x = (b-a)/2.0*x + (b+a)/2.0
w = (b-a)/2.0*w
# 绘制波函数变化图像
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(12, 8))
for i, k in enumerate(k_vec):
wave_func = np.abs(np.array(calc_wave_func(k, x, N)))
ax = axes[i//3, i%3]
ax.plot(x, wave_func)
ax.set_title(f'Wave function for k={k:.1f}')
ax.set_xlabel('x')
ax.set_ylabel('|psi(x)|')
plt.tight_layout()
plt.show()
```
这段代码中,我们添加了绘图部分,其中使用了 `subplots()` 函数创建了 2x3 的图像区域,然后使用循环对不同能量下的波函数进行绘制,最后使用 `tight_layout()` 函数调整图像布局,使得图像之间的间隔更加美观。
阅读全文