在Python 2.7中检查失败后,无论如何都会删除列表元素

时间:2016-02-23 01:01:55

标签: python

我正在尝试为非共模的模数做一个线性同余解算器系统,这需要我将每个模数分解为其主要的因子分解并将它们相互比较以创建一个可解决的新系统。基本上我需要做的是将数字分解为其主要权力(即36变为4 * 9而不是2 * 2 * 3 * 3)然后将其与其他模数进行比较并移除任何重叠的主要权力(即,一个数字因子为4而另一个数字因子为2,我们删除因子2)。

出于某种原因,当我运行我的代码时,许多因素都会被删除,无论它们是否是其他模数中另一个主要幂的较小幂。例如(我已经包括下面这个),当你采用模数对1000142和1002045时,数字化为1002045,其因子分解为3 * 5 * 11 * 6073,仅在我对它运行检查后返回[6073],即使这两个模数没有共同的主要权力。

有谁知道为什么会这样?我很确定我的is_prime和factorize方法是正确的 - 我已经在数字范围上广泛地测试它们而没有问题。为什么在条件检查失败时会从列表中删除项目?

请忽略totient和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)

1 个答案:

答案 0 :(得分:1)

查看crt函数,我看到您在向前迭代它们时修改了nfactorsmfactors列表。您不知道您按照您认为迭代副本的方式执行操作。但是,nfacts只是对nfactors相同的可变列表实例的另一个引用,m...也是如此。要获得真正的独立副本,请执行

nfacts = nfactors[:]
mfacts = mfactors[:]