2015-03-18 5 views
-1

Вот мой код:Как ограничить работу Python только целыми числами?

import math 

# I define a function that will calculate the log 

def shank(a,p,z): 
    x=math.log(p,a)%z 

    return (x) 

print("First log") 
print(shank(106, 12375, 24691)) 


print("Second log") 
print(shank(6, 248388, 458009)) 

Я получаю правильные ответы, но это не дает мне целых чисел. Например, если я вход

print(shank(3, 525, 809)) 

я 5,701190790597276, а 309 также работает и будет ответ, который я предпочитаю. Спасибо за любую помощь.

+3

Вы пытаетесь вычислить дискретные логарифмы? 'math.log (p, a)% z' не является дискретным логарифмом. – user2357112

+1

Вы должны дать правильное описание того, что вы пытаетесь сделать, хотя это выглядит скорее как математическая проблема, чем проблема программирования. – wvdz

+0

Ответ 'math.log (p, a)' возвращает float, поэтому я не знаю, почему вы ожидаете целое число. – physicalattraction

ответ

2

math.log(p, a) % z не является дискретным логарифмом. Это выражение говорит Python о вычислении регулярного логарифма, делить его на z и дать вам остаток. Если бы вы каким-то образом ограничили Python работать только с целыми числами, вы все равно не получили бы дискретный логарифм; вы получите исключение, когда Python обнаружит, что math.log(p, a) не имеет целочисленного решения.

Python не имеет встроенную процедуру дискретного логарифма. Вычисление дискретных логарифмов эффективно является одной из известных нерешенных проблем информатики, и многие криптографические системы полагаются на это, будучи сложными. Тем не менее, если вы хорошо с мучительно медленным решением, вы можете просто вычислить все выше и выше модульные полномочия до тех пор, пока не найдете тот, который работает:

def discrete_log(base, target, modulus): 
    i = 0 
    power = 1 
    while power != target: 
     power = (power * base) % modulus 
     i += 1 
    return i 
+0

Спасибо за объяснение. Я действительно понимаю, что с действительно большими числами мне нужно было бы использовать другие методы, чем просто прямые вычисления, я просто пытался получить базовую функцию для меньших чисел – AK9309