2014-05-20 13 views
6

Próbuję obliczyć niektóre num1**num2 w Pythonie. Problem polega jednak na tym, że num1 to 93192289535368032L i to , które są bardzo dużymi liczbami.pow lub ** dla bardzo dużej liczby w Pythonie

Próbowałem kilka metod w następujący sposób: Po pierwsze, próbowałem obliczyć go za pomocą operatora **. Ale zajęło to zbyt dużo czasu (czekałem około 2 godzin, ale nie mam wyniku).

Po drugie, użyłem math.pow(num1, num2). Ale mam to:

Traceback (most recent call last): File "<pyshell#23>", line 1, in <module> 
    math.pow(84585482668812077L, 93192289535368032L) 
OverflowError: math range error 

Wreszcie, użyłem numpy.power:

numpy.power(84585482668812077, 93192289535368032) 
-9223372036854775808 

Jak widać, to dał mi minusa.

Co naprawdę chcę zrobić, to result = (num1**num2), a następnie result % num3. Muszę więc wydajnie obliczyć tę wartość mocy.

Jak mogę to zrobić?

+2

Ponieważ robisz '(num1 ** num2)% num3', należy zajrzeć do uogólnienia' Fermata Litte Theorem'. Sprawdź na wikipedia – sshashank124

+0

@ sshashank124 Dzięki za dobre referencje. – GoodGJ

Odpowiedz

12

Należy zdać num3 jako 3rd parametru pow

 
pow(...) 
    pow(x, y[, z]) -> number 

    With two arguments, equivalent to x**y. With three arguments, 
    equivalent to (x**y) % z, but may be more efficient (e.g. for longs). 
+0

Dzięki. Myślę, że muszę zaimportować "matematyki" za użycie pow. Ale w Pythonie jest domyślny pow. – GoodGJ

+0

Co jest nie tak z importowaniem biblioteki matematycznej? –

+7

Nie chcesz importować 'pow' z' matematyki'-- to C 'pow', który nie akceptuje trzeciego argumentu. – DSM

Powiązane problemy