Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 16, 2010 13:52:14

Eliont
От:
Зарегистрирован: 2010-05-30
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Медленная работа при операциях с большими числами

Криптографияеский метод шаг карлика - шаг великана, реализованный на питоне с модулем порядка 10 миллионов работает почти минуту, хотя по идее должен секунду а то и меньше.
Код правильный, полного перебора обоих списков не производится.

def fastpower(base, exponent, mod=1):
res = 1
while(exponent > 0):
if exponent % 2 == 0:
exponent /= 2
base = mod > 1 and (base*base)%mod or base*base
else:
exponent-=1
res = mod > 1 and (res*base)%mod or res*base
return mod > 1 and res%mod or res

# searching X in A^X mod P = Y
def steps(a,p,y):

k = int (math.sqrt(p))
m = k + 2

child = [y%p,(y*a)%p]
for i in range (2, m):
t = fastpower(a,i)
t *= y
t %= p
child.append (int(t))
child.sort()

giant = []
for i in range (1, k + 1):
giant.append (int(fastpower(a,i*m,p)))
giant.sort()

c,g = 0,0
result = []
while True:
if child[c] is giant[g]:
x = (c+1) * m - (g+1)
result.append(x)
c += 1
g += 1
elif child[c] < giant[g]:
c += 1
elif child[c] > giant[g]:
g += 1

if c >= len(child)-1:
c = len(child)-1
for gp in range(g,len(giant)):
if child[c] is giant[gp]:
x = (c+1) * m - (gp+1)
result.append(x)
return result

if g >= len(giant)-1:
g = len(giant)-1
for cp in range(c,len(child)):
if child[cp] is giant[g]:
x = (cp+1) * m - (g+1)
result.append(x)
return result

return result



Отредактировано (Окт. 16, 2010 13:55:41)

Офлайн

#2 Окт. 16, 2010 14:17:01

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Медленная работа при операциях с большими числами

вместо range используй xrange!
и заюзай psyco

Офлайн

#3 Окт. 16, 2010 14:36:19

Eliont
От:
Зарегистрирован: 2010-05-30
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Медленная работа при операциях с большими числами

Спасибо.
Тогда такой вопрос - а есть pysco для python 2.7 ?
Или можно на комп два питона поставить?



Офлайн

#4 Окт. 16, 2010 15:19:09

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Медленная работа при операциях с большими числами

А вы уверены, что ваша fastpower будет быстрее стандартного pow?



Офлайн

#5 Окт. 16, 2010 17:59:28

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Медленная работа при операциях с большими числами

Андрей Светлов
А вы уверены, что ваша fastpower будет быстрее стандартного pow?
теоретический, fastpower должен быть медленнее
может просто fastpower делает что-то другое…?

Офлайн

#6 Окт. 16, 2010 18:04:45

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Медленная работа при операциях с большими числами

а может ТС воспользуется модулем corepy? Он позволяет включать ассемблерный код в питонерный скрипт



Офлайн

#7 Окт. 16, 2010 19:10:37

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Медленная работа при операциях с большими числами

guranvir, не советуйте лишнего. Ходить нужно ногами, а кушать - руками.

o7412369815963, сами посмотрите - возведение в степень и деление по модулю. Не верите - сравните. Только fastpower неправильно работает на некоторых данных :)



Офлайн

#8 Окт. 18, 2010 09:15:42

Eliont
От:
Зарегистрирован: 2010-05-30
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Медленная работа при операциях с большими числами

o7412369815963
делает что-то другое…?
По словам нашего криптографа при больших числах она должна быть быстрее + вычисления сразу по модулю. По-модулю - это, собственно, её основное назначение.



Офлайн

#9 Окт. 18, 2010 09:24:41

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Медленная работа при операциях с большими числами

Eliont
o7412369815963
делает что-то другое…?
По словам нашего криптографа при больших числах она должна быть быстрее + вычисления сразу по модулю. По-модулю - это, собственно, её основное назначение.
это возможно на компилируемых языках, снижаем “качество” повышая производительность. для питона такое не пройдет (скорее всего).

Отредактировано (Окт. 18, 2010 09:24:56)

Офлайн

#10 Окт. 18, 2010 16:29:34

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Медленная работа при операциях с большими числами

Ваш криптограф смотрел на реализацию int_pow/long_pow (intobject.c и longobject.c соответственно)?
Вы вдвоем обратили внимание на тот факт, что pow принимает до трех аргументов, при этом третий - как раз модуль, по которому нужно делить?

int_pow несколько похожа на вашу fastpower.



Отредактировано (Окт. 18, 2010 19:16:32)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version