为什么列表会记住模数计算?贤者,蟒蛇

时间:2017-03-01 12:58:25

标签: python sage

我在sageMath工作表中有一个列表v,如下所示

v = [3, 5, 22, 35, 230, 308, 683, 6546]
m = 14002
a = 185

然后我对列表中的每个数字进行模数计算

for i in range(0, len(v)):
    v[i] = mod(v[i] * a, m)

我的问题是,当我后来想要对列表进行其他计算时,mod()函数以某种方式仍然被列表记住。我试图将列表复制到另一个列表,但它不起作用。

例如,下面的循环返回6714,但应该返回2071620716 % 14002 = 6714

for i in range(len(v)):
    c = c + v[i]

我通过在v上再进行一次modulu计算解决了这个问题,如

for i in range(len(v)):
    v[i] = mod(v[i], next_prime(m*m))

我的问题是,是否有更好的方法来解决问题

1 个答案:

答案 0 :(得分:1)

我现在明白你的问题。使用mod()时会发生什么,它会自动生成整数元素 modulo n ,而不仅仅是任何旧整数。所以你永远不能摆脱它。如果你真的想要剩下的,你可以使用内置的Python %

v = [3, 5, 22, 35, 230, 308, 683, 6546]
m = 14002
a = 185
for i in range(0, len(v)):
    v[i] = v[i] * a % m

for i in range(len(v)):
    print v[i]*m

产生以7771110开头的列表。类型仍然(正确)为sage.rings.integer.Integer