我正在尝试为非互质的模做一个线性同余解算器系统,它要求我把每个模分解成它的素分解,并将它们相互比较,以创建一个新的可解系统。基本上我需要做的是把一个数分解成素数幂(即36变成4*9,而不是2*2*3*3),然后把它和其他模比较,去掉任何重叠的素数幂(即如果一个数的因子是4,另一个数的因子是2,我们去掉因子2)
出于某种原因,当我运行代码时,许多因素都被去除了,不管它们是否是另一个模中另一个素数幂的较小幂。例如(我在下面已经包括了这个),当取模对1000142和1002045时,数字1002045,它有一个3*5*11*6073的因式分解,在我对它进行检查后只返回[6073],即使这两个模没有共同的素数幂
有人知道为什么会这样吗?我很确定我的is\u prime和factorize方法是正确的-我已经在数的范围内对它们进行了广泛的测试。当条件检查失败时,为什么要从我的列表中删除项目
请忽略那些托蒂和CRT的东西-这不重要
任何建议都将不胜感激
import time
from itertools import combinations
from fractions import gcd
def is_power(a, b):
if a > b:
a, b = b, a
while a != b:
if b % a != 0:
return False
b /= a
return True
def factorize(n):
primfac = []
d = 2
i = -1
while d <= n:
if n % d == 0:
primfac.append(1)
i += 1
while (n % d) == 0:
primfac[i] *= d
n //= d
d += 1
return primfac
def crt(n, m):
ans = 0
nfactors = primeFactorizations[n]
nfacts = nfactors
mfactors = primeFactorizations[m]
mfacts = mfactors
n = n + 1000000
m = m + 1000000
for nfactor in nfacts:
for mfactor in mfacts:
else:
if is_power(nfactor, mfactor) is True:
if nfactor > mfactor:
mfactors.remove(mfactor)
m //= mfactor
if mfactor > nfactor:
nfactors.remove(nfactor)
n //= nfactor
if mfactor == nfactor:
mfactors.remove(mfactor)
m // mfactor
else:
pass
print nfactors
print mfactors
primeFactorizations = []
for i in range(1000000, 1005000):
primeFactorizations.append(factorize(i))
for n in range(0, 4999):
for m in range(n+1, 5000):
crt(n, m)
查看
crt
函数,我看到您在向前迭代nfactors
和mfactors
列表时修改了它们。您没有意识到您在迭代副本时所做的一切。然而,nfacts
只是对与nfactors
相同的可变列表实例的另一个引用,对m...
也是如此。要得到真正的独立副本,请相关问题 更多 >
编程相关推荐