2013-11-20 3 views
-1

Я пытаюсь сделать функцию, которая вычисляет модульную экспоненту MODEXP(a,e,p).Функция Python зависает для больших чисел

Эта функция принимает m и n в качестве параметров, где p простое число, самое большее 2^m и e является 2^n и a это случайное число меньше, чем p.

Вот мой код:

import random 
def question_3(m,n): 
    list = [] 
    i = 1 
    for i in range(2,2**m): 
     flag=True 
     for num in list: 
      if(i%num==0): 
       flag=False 
     if flag: 
      list.append(i) 
      p = choice(list) 
      a = randint(1,int(p)-1) 
      e = pow(2,n) 
    return pow(a, e, p) 

question_3(5,5) 

Для m и n более 20, код начинает зависать. Как я могу это предотвратить?

+0

У вас есть цикл for, который должен работать более миллиона раз. Как быстро вы этого хотели? – geoffspear

+0

Я хочу, чтобы при вводе, например, m и n равняется 500, он будет работать и я хочу, чтобы он занимал всего несколько мс. –

+0

Ну, вам нужно будет разработать алгоритм, который не предполагает составление списка из 2^500 целые числа, а затем перебирать их, чтобы сделать это быстро. – geoffspear

ответ

-1

Если вы просто хотите, чтобы вычислить
(модуля a, возведенного в степень e) моды p
или что-то подобное, то

Я очень рекомендую вам эти вика article

В этом случае максимальное число итераций будет равно числу бит в двоичном представлении переменной e.

+1

Не нужно читать статью, в Python это просто 'pow (a, e, p)'. Но OP уже использует это, поэтому я понятия не имею, что они на самом деле пытаются сделать. – interjay

+1

Я написал это потому, что, поскольку OP бит нечеткий, он может прочитать статью и использовать ее в своей собственной реализации. (Это может помочь) И что-то читать, а затем использовать его намного лучше, чем использовать 'pow (a, e , p) «слепо. – adil

+0

Нет, изобретать колесо не лучше, чем использовать существующее встроенное решение. И в любом случае это не похоже на то, что требуется OP - первое предложение в вопросе, похоже, вводит в заблуждение. – interjay

Смежные вопросы