2009-06-07 11 views
0

Je suis en train de découvrir a^b en python, de vraiment grand no.sComment trouver un^b de très grands nombres en python?

Mon code est le suivant:

t=raw_input() 
c=[] 
for j in range(0,int(t)): 
    n=raw_input() 
    a=[] 
    a,b= (int(i) for i in n.split(' ')) 
    c.extend(pow(a,b)) 
for j in c: 
    print j 

Et je me fais une erreur comme ceci:

raceback (most recent call last): 
    File "C:/Python26/lastdig.py", line 7, in <module> 
    c.extend(pow(a,b)) 
TypeError: 'int' object is not iterable 

Qu'est-ce qui ne va pas dans mon problème et est-ce un moyen efficace de trouver des pouvoirs de grands nombres?

+0

hein? vous n'avez pas étendre sur votre 7ème ligne, vous avez ajouté, cela ne causerait pas une telle erreur. – SilentGhost

+0

Plese fournissent les entrées que vous donnez au programme. Aussi, êtes-vous sûr que le code source que vous avez fourni et l'erreur correspondent? –

+7

votre question et votre erreur sont deux bêtes complètement différentes. – SilentGhost

Répondre

1

Vous devriez essayer GMPY. Essayez quelque chose comme:

import gmpy 
a = gmpy.mpz(10**10) 
b = a**10000000 

Je ne sais pas combien « grand » vos chiffres sont, cette solution n'est pas rapide (mais le résultat est assez grand: P)

-1

Une autre façon vous pourriez vouloir essayer de calculer les exposants est en utilisant des lois logarithmiques.

x^y = e^(y ln x)

Je ne peux pas dire avec certitude, mais cela pourrait réduire le nombre d'opérations nécessaires pour calculer les grands exposants.

+1

non ce ne sera pas, ce sera 10 fois plus lent – SilentGhost

+0

Je suis curieux de savoir si cela facilite un avantage de performance; Tout dépend de l'implémentation de powon par python. J'attends un commentaire d'expert à ce sujet. –

+0

pow() se fait par quadrillage répété, donc c'est très efficace. Pour les nombres de taille modérée, le logarithme est à peu près le même ou légèrement plus rapide, mais pow() est supérieur en général car il calcule la réponse exacte au lieu d'une approximation en virgule flottante et ne débordera pas sur les grands nombres. – Kiv

1

ops entier Python sont une précision arbitraire Si vous voulez précision arbitraire opérations à virgule flottante importation décimal

from decimal import * 
d=Decimal('2.0') 
print d**1234 
2

10000 ** 10000 impressions dans ma machine en moins d'une seconde.

Quelle est la taille de votre entrée.

Votre problème n'est pas lié à la fonction d'alimentation.

utilisation

c.append() 

au lieu de

c.extend() 

c.extend prend une iterable (une liste/tuple/SET/iterables personnalisés) comme entrée.

3

Vous utilisez étendre mal. A.extend (B), requiert que B soit un objet itérable (ie une liste, un tuple). Vous voulez vraiment utiliser append à la place.

t=raw_input() 
c=[] 
for j in range(0,int(t)): 
    n=raw_input() 
    a,b= (int(i) for i in n.split(' ')) 
    c.append(pow(a,b)) ## or you could extend c.extend([ pow(a,b) ]), but thats silly. 
for j in c: 
    print j 
1

x**y fonctionne beaucoup pour les exposants. Si vous voulez une solution plus originale, vous pouvez utiliser:

def exp(base, exponent): 
    round(exponent, 0) 
    if exponent < 0: 
    return 1.0/exp(base, -1 * exponent) 
    if exponent == 0: 
    return 1 
    if exponent > 0: 
    return base * exp(base, exponent - 1)` 

Malheureusement, cela ne fonctionne que pour les exposants exactement entiers.

+0

Hé, j'ai essayé exp (2,100) et la profondeur de récursivité alto maxi dépassée! – sayan

Questions connexes