列出在python2.7中签入失败后仍然发生的元素删除

2024-09-28 17:24:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为非互质的模做一个线性同余解算器系统,它要求我把每个模分解成它的素分解,并将它们相互比较,以创建一个新的可解系统。基本上我需要做的是把一个数分解成素数幂(即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)

Tags: inimportforifisdef素数因子
1条回答
网友
1楼 · 发布于 2024-09-28 17:24:07

查看crt函数,我看到您在向前迭代nfactorsmfactors列表时修改了它们。您没有意识到您在迭代副本时所做的一切。然而,nfacts只是对与nfactors相同的可变列表实例的另一个引用,对m...也是如此。要得到真正的独立副本,请

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

相关问题 更多 >