Jump to content
Leudassdf

Converter função escrita em python2 em python3

Recommended Posts

Leudassdf

Boa noite amigos,

Tenho uma função que lida com números longos em python2. Pelo que li em python3 os números longos foram unificados e a função long deixou de existir e o L no final dos números deixou de ser necessário.
Portanto eu fiz as alterações que me pareciam corretas mas o resultado que obtenho em python3 é um erro enquanto que em python2 é um número válido.

Deixo as versões em python2 e em python3... Espero que alguém me consiga ajudar na identificação e resolução do problema.

Pelos testes que fiz o meu v3 * 0.0 dá erro. Se for v3 * 0 já dá OK em python3. Não estou a conseguir perceber como fazer para em python3 produzir os mesmos resultados.

Grato a quem me puder ajudar

Python2

def inverse(u, v):
    """inverse(u:long, u:long):long
    Return the inverse of u mod v.
    """
    u3, v3 = u, v
    u1, v1 = 1L, 0L
    while v3 > 0:
        q=u3 / v3
        u1, v1 = v1, u1 - v1*q
        u3, v3 = v3, u3 - v3*q
    while u1<0:
        u1 = u1 + v
    return u1

v3 = 16328632084933010002384055033805457329601614771185955389739167309086214800406465799038583663495375294167564556218249812075026498049238137557936767564877129380031037096474576701424363585184425538239734829952673040443267770476629574802693913227893783846194285964464469846943061687644767462460965622580087564339212631775817895958409016676398975671266179637898557687317076217721884323315069515788106125705301913307854592898356222139631316962247550981844266104701843862648069010239662367183672047107559358990137503061077380023641379174265957374038711141877508504346564731250609196846638183903982387884578266136503697493474682071

print(inverse(1, v3))
#retorna 1

 

Python3

def inverse(u, v):
    """inverse(u:long, u:long):long
    Return the inverse of u mod v.
    """
    u3, v3 = u, v
    u1, v1 = 1, 0
    while v3 > 0:
        q=u3 / v3
        u1, v1 = v1, u1 - v1*q
        u3, v3 = v3, u3 - v3*q
    while u1<0:
        u1 = u1 + v
    return u1

v3 = 16328632084933010002384055033805457329601614771185955389739167309086214800406465799038583663495375294167564556218249812075026498049238137557936767564877129380031037096474576701424363585184425538239734829952673040443267770476629574802693913227893783846194285964464469846943061687644767462460965622580087564339212631775817895958409016676398975671266179637898557687317076217721884323315069515788106125705301913307854592898356222139631316962247550981844266104701843862648069010239662367183672047107559358990137503061077380023641379174265957374038711141877508504346564731250609196846638183903982387884578266136503697493474682071

print(inverse(1, v3))
#Despoleta o seguinte erro: int to large to convert to float.

 

Share this post


Link to post
Share on other sites
Leudassdf

Depois de analisar melhor o código percebi que em python2 se ambos os argumentos da função forem do tipo inteiro o operador de divisão / faz a divisão inteira. Este operador em python3 faz sempre a divisão "normal".

A solução passou por fazer u3 // v3 ao invés de u3 / v3

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.