Почему вычисления модуля запоминаются списками? шалфей, питон

У меня есть список v на листе sageMath, подобный этому

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, но должен возвращать 20716 и 20716 % 14002 = 6714

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

Я решил проблему, выполнив еще один расчет модуля на v, например

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

Мой вопрос в том, есть ли лучший способ решить проблему


person Mallom    schedule 01.03.2017    source источник
comment
Возможный дубликат Как клонировать или копировать список?   -  person Christian Dean    schedule 01.03.2017
comment
Как ваше решение решает проблему? Я предполагаю, что это другой расчет, чем приведенный выше, за исключением того, что next_prime берет корень m * m. Что вы подразумеваете под функцией mod(), каким-то образом все еще запоминается списком. Постарайтесь четко выразить то, что вы хотите. Также постарайтесь предоставить пример с нужными импортами (откуда берутся мод и next_prime?), не заставляйте людей пытаться помочь вам обо всем догадаться.   -  person CodeMonkey    schedule 01.03.2017
comment
@CodeMonkey Я предполагаю, что он пытался скопировать список v, выполнив x = v, где x - это переменная для копирования. И, как известно многим опытным питонистам, это не работает.   -  person Christian Dean    schedule 01.03.2017
comment
@leaf Я не уверен, что он делает. Я пытаюсь дать ему конструктивную критику, чтобы он мог задавать более правильные вопросы в будущем.   -  person CodeMonkey    schedule 01.03.2017
comment
Если вы не хотите, чтобы числа в v менялись, зачем вы их меняете? Вместо этого вы должны создать новый список, содержащий результаты вычислений модуля. Хороший способ сделать это — использовать понимание списка.   -  person PM 2Ring    schedule 01.03.2017


Ответы (1)


Теперь я понимаю ваш вопрос. Что происходит, когда вы используете mod(), так это то, что он автоматически создает элемент целых чисел по модулю 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.

person kcrisman    schedule 28.03.2017