Quantcast

operador % (modulo) funciona com até quantos algarismos?

classic Classic list List threaded Threaded
13 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

operador % (modulo) funciona com até quantos algarismos?

Guilherme Freire
Eai galera bão?

e o seguinte eu preciso fazer algumas continhas um pouco grandes
tipo 17069174130723235958610643029059314756044734431 % 32 que da 31 mais no
python está dando 31L como faço para mudar isso
eu gostaria de entender também o porque disso se alguém puder ajudar


Galera Obrigado mesmo sei que alguma das minhas dúvidas são meio bobas mais
estou tentando melhorar sempre e quem sabe daqui a um tempo poder ajudar a
galera daqui também

--
--
Guilherme Freire
Analista de Suporte
Soluções em TI
MCDST / MCSA / MCDST
31-86768982


[As partes desta mensagem que não continham texto foram removidas]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Leonardo Santagada
2011/4/27 Guilherme Freire <[hidden email]>:
> e o seguinte eu preciso fazer algumas continhas um pouco grandes
> tipo 17069174130723235958610643029059314756044734431 % 32 que da 31 mais no
> python está dando 31L como faço para mudar isso

esse numero gigante é um long no python, porque não cabe em um
inteiro, e o resultado de uma operação com long vai ser long. A
principio não tem como mudar, tu pode passar o resultado para int que
vai converter ele para um inteiro pequeno se couber. Se tu queria
entender eu acho que é isso, mas só por curiosidade, o que tu esta
fazendo? Talvez tenha uma outra forma de resolver o problema se eu
entender mais sobre ele, tu usa esse numero pra que, porque ele
precisa ser um int e não um long?

--
Leonardo Santagada
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Adam Victor Nazareth Brandizzi
In reply to this post by Guilherme Freire
2011/4/27 Guilherme Freire <[hidden email]>:
>
> e o seguinte eu preciso fazer algumas continhas um pouco grandes
> tipo 17069174130723235958610643029059314756044734431 % 32 que da 31 mais no
> python está dando 31L como faço para mudar isso
> eu gostaria de entender também o porque disso se alguém puder ajudar

Em Python 2.x, há dois tipos de inteiros: int e long. Int armazena
valores até um limite (2**32, acho); já long não tem limite de
armazenamento. Para deixar claro que um número é long, o terminal de
Python coloca um 'L' ao final dele:

>>> 33424
33424
>>> 343435243434
343435243434L

Pois bem, seu número gigantesco é um long, e você faz módulo com 32,
que é um int. O resultado da operação vai ser do tipo long - o número
resultante é pequeno, mas a regra é essa. Não precisa se preocupar com
isto, normalmente: embora os tipos dos valores sejam diferentes...

>>> type(32L)
<type 'long'>
>>> type(32)
<type 'int'>
>>> type(32L) == type(32)
False

...os valores são equivalentes:

>>> 32L == 32
True

Resumindo: o "%" funcionou, e "L" ao lado do número não é problema
algum, só ressalta que é um long.

Há razões para se querer que um número seja int - por exemplo, longs
são mais lentos e usam mais memória. Como você está começando agora,
duvido *muito* que você tenha de se preocupar com isto. Entretanto, se
tiver de usar números int dentro do possível, também não tem problema,
é só passar o long para o construtor de int:

>>> 31L
31L
>>> type(31L)
<type 'long'>
>>> int(31L)
31
>>> type(int(31L))
<type 'int'>

Note, porém, que se o long passado por parâmetro não couber num int, o
valor retornado vai ser long do mesmo jeito:

>>> int(71495013479841328)
71495013479841328L
>>> type(int(71495013479841328))
<type 'long'>


Mas, como disse, creio que você não tem de se preocupar com isto. O
resumo é, mesmo, que este "L" não é problema algum :)

> Galera Obrigado mesmo sei que alguma das minhas dúvidas são meio bobas mais
> estou tentando melhorar sempre e quem sabe daqui a um tempo poder ajudar a
> galera daqui também

Bem, boa sorte!

Até!

--
Adam Victor Nazareth Brandizzi
http://brandizzi.googlepages.com/
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Guilherme Freire
pior que eu preciso de tratar esse valor de long para int sim

eu estou fazendo um trabalho de criptografia sobre grupos, subgrupos e
subgrupos ciclicos

no caso eu pego uma lista de numeros e elevo aos valores delas tirando o
modulo meu numero final nunca vai ser grande para ser long mais o elevado
sim
acho que só colocando o int(32) já resolve

segue meu programa para vocês darem uma olhada se tiver alguma coisa errada
também
http://pastebin.com/wNvDe0B1

<http://pastebin.com/wNvDe0B1>não reparem nos print pq ainda estou testando

Em 27 de abril de 2011 18:52, Adam Victor Nazareth Brandizzi <
[hidden email]> escreveu:

>
>
> 2011/4/27 Guilherme Freire <[hidden email]>:
> >
> > e o seguinte eu preciso fazer algumas continhas um pouco grandes
> > tipo 17069174130723235958610643029059314756044734431 % 32 que da 31 mais
> no
> > python está dando 31L como faço para mudar isso
> > eu gostaria de entender também o porque disso se alguém puder ajudar
>
> Em Python 2.x, há dois tipos de inteiros: int e long. Int armazena
> valores até um limite (2**32, acho); já long não tem limite de
> armazenamento. Para deixar claro que um número é long, o terminal de
> Python coloca um 'L' ao final dele:
>
> >>> 33424
> 33424
> >>> 343435243434
> 343435243434L
>
> Pois bem, seu número gigantesco é um long, e você faz módulo com 32,
> que é um int. O resultado da operação vai ser do tipo long - o número
> resultante é pequeno, mas a regra é essa. Não precisa se preocupar com
> isto, normalmente: embora os tipos dos valores sejam diferentes...
>
> >>> type(32L)
> <type 'long'>
> >>> type(32)
> <type 'int'>
> >>> type(32L) == type(32)
> False
>
> ...os valores são equivalentes:
>
> >>> 32L == 32
> True
>
> Resumindo: o "%" funcionou, e "L" ao lado do número não é problema
> algum, só ressalta que é um long.
>
> Há razões para se querer que um número seja int - por exemplo, longs
> são mais lentos e usam mais memória. Como você está começando agora,
> duvido *muito* que você tenha de se preocupar com isto. Entretanto, se
> tiver de usar números int dentro do possível, também não tem problema,
> é só passar o long para o construtor de int:
>
> >>> 31L
> 31L
> >>> type(31L)
> <type 'long'>
> >>> int(31L)
> 31
> >>> type(int(31L))
> <type 'int'>
>
> Note, porém, que se o long passado por parâmetro não couber num int, o
> valor retornado vai ser long do mesmo jeito:
>
> >>> int(71495013479841328)
> 71495013479841328L
> >>> type(int(71495013479841328))
> <type 'long'>
>
> Mas, como disse, creio que você não tem de se preocupar com isto. O
> resumo é, mesmo, que este "L" não é problema algum :)
>
>
> > Galera Obrigado mesmo sei que alguma das minhas dúvidas são meio bobas
> mais
> > estou tentando melhorar sempre e quem sabe daqui a um tempo poder ajudar
> a
> > galera daqui também
>
> Bem, boa sorte!
>
> Até!
>
> --
> Adam Victor Nazareth Brandizzi
> http://brandizzi.googlepages.com/
>
>  
>



--
--
Guilherme Freire
Analista de Suporte
Soluções em TI
MCDST / MCSA / MCDST
31-86768982


[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
    [hidden email]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html


Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Carlos Ribeiro
2011/4/27 Guilherme Freire <[hidden email]>

> pior que eu preciso de tratar esse valor de long para int sim
>

O fato de ser inteiro longo faz tanta diferença assim para você? Do ponto de
vista matemático, um inteiro longo é tão "inteiro" quanto um int de 32 bits
(ou até mais visto que a faixa é praticamente ilimitada).

Os únicos motivos reais que eu imagino para precisar ser int seria
performance, ou necessidade de interfacear com bibliotecas em C, ou alguma
restrição "artificial" do seu trabalho (tipo o professor mandou). Se for
isso tudo bem, senão pode usar o inteiro longo mesmo.

--
Carlos Ribeiro
Consultoria em Projetos
twitter: http://twitter.com/carribeiro
blog: http://rascunhosrotos.blogspot.com
mail: [hidden email]


[As partes desta mensagem que não continham texto foram removidas]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Guido Carballo-Guerrero
In reply to this post by Guilherme Freire
>>> int(17069174130723235958610643029059314756044734431 % 32 )
31

On Apr 27, 2011, at 6:34 PM, Guilherme Freire wrote:

> 17069174130723235958610643029059314756044734431 % 32



[As partes desta mensagem que não continham texto foram removidas]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

André Lima-3
In reply to this post by Guilherme Freire
Guilherme, acho que você pode usar a função built-in pow().

Documentação em: http://docs.python.org/library/functions.html#pow

No seu caso, você poderia substituir o trecho:

x1=a**k
x2=x1%n

por

x2 = pow(a, k, n)

Abraços,
André

2011/4/27 Guilherme Freire <[hidden email]>:

> pior que eu preciso de tratar esse valor de long para int sim
>
> eu estou fazendo um trabalho de criptografia sobre grupos, subgrupos e
> subgrupos ciclicos
>
> no caso eu pego uma lista de numeros e elevo aos valores delas tirando o
> modulo meu numero final nunca vai ser grande para ser long mais o elevado
> sim
> acho que só colocando o int(32) já resolve
>
> segue meu programa para vocês darem uma olhada se tiver alguma coisa errada
> também
> http://pastebin.com/wNvDe0B1
>
> <http://pastebin.com/wNvDe0B1>não reparem nos print pq ainda estou testando
>
> Em 27 de abril de 2011 18:52, Adam Victor Nazareth Brandizzi <
> [hidden email]> escreveu:
>
>>
>>
>> 2011/4/27 Guilherme Freire <[hidden email]>:
>> >
>> > e o seguinte eu preciso fazer algumas continhas um pouco grandes
>> > tipo 17069174130723235958610643029059314756044734431 % 32 que da 31 mais
>> no
>> > python está dando 31L como faço para mudar isso
>> > eu gostaria de entender também o porque disso se alguém puder ajudar
>>
>> Em Python 2.x, há dois tipos de inteiros: int e long. Int armazena
>> valores até um limite (2**32, acho); já long não tem limite de
>> armazenamento. Para deixar claro que um número é long, o terminal de
>> Python coloca um 'L' ao final dele:
>>
>> >>> 33424
>> 33424
>> >>> 343435243434
>> 343435243434L
>>
>> Pois bem, seu número gigantesco é um long, e você faz módulo com 32,
>> que é um int. O resultado da operação vai ser do tipo long - o número
>> resultante é pequeno, mas a regra é essa. Não precisa se preocupar com
>> isto, normalmente: embora os tipos dos valores sejam diferentes...
>>
>> >>> type(32L)
>> <type 'long'>
>> >>> type(32)
>> <type 'int'>
>> >>> type(32L) == type(32)
>> False
>>
>> ...os valores são equivalentes:
>>
>> >>> 32L == 32
>> True
>>
>> Resumindo: o "%" funcionou, e "L" ao lado do número não é problema
>> algum, só ressalta que é um long.
>>
>> Há razões para se querer que um número seja int - por exemplo, longs
>> são mais lentos e usam mais memória. Como você está começando agora,
>> duvido *muito* que você tenha de se preocupar com isto. Entretanto, se
>> tiver de usar números int dentro do possível, também não tem problema,
>> é só passar o long para o construtor de int:
>>
>> >>> 31L
>> 31L
>> >>> type(31L)
>> <type 'long'>
>> >>> int(31L)
>> 31
>> >>> type(int(31L))
>> <type 'int'>
>>
>> Note, porém, que se o long passado por parâmetro não couber num int, o
>> valor retornado vai ser long do mesmo jeito:
>>
>> >>> int(71495013479841328)
>> 71495013479841328L
>> >>> type(int(71495013479841328))
>> <type 'long'>
>>
>> Mas, como disse, creio que você não tem de se preocupar com isto. O
>> resumo é, mesmo, que este "L" não é problema algum :)
>>
>>
>> > Galera Obrigado mesmo sei que alguma das minhas dúvidas são meio bobas
>> mais
>> > estou tentando melhorar sempre e quem sabe daqui a um tempo poder ajudar
>> a
>> > galera daqui também
>>
>> Bem, boa sorte!
>>
>> Até!
>>
>> --
>> Adam Victor Nazareth Brandizzi
>> http://brandizzi.googlepages.com/
>>
>>
>>
>
>
>
> --
> --
> Guilherme Freire
> Analista de Suporte
> Soluções em TI
> MCDST / MCSA / MCDST
> 31-86768982
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> ------------------------------------
>
> Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
> Links do Yahoo! Grupos
>
>
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Leonardo Santagada
2011/4/28 André Lima <[hidden email]>:

> Guilherme, acho que você pode usar a função built-in pow().
>
> Documentação em: http://docs.python.org/library/functions.html#pow
>
> No seu caso, você poderia substituir o trecho:
>
> x1=a**k
> x2=x1%n
>
> por
>
> x2 = pow(a, k, n)

Wow muito legal, porque será q é mais rápido? Talvez seja porque só
precisa calcular os bits menos significativos mas eu não faço ideia

E Guilherme, vendo o código eu não vi porque tem q ser um inteiro e
não pode ser um longo, tu pode nos explicar?


--
Leonardo Santagada
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Luciano Rodrigues da Silva
2011/4/28 Leonardo Santagada <[hidden email]>:

> 2011/4/28 André Lima <[hidden email]>:
>> Guilherme, acho que você pode usar a função built-in pow().
>>
>> Documentação em: http://docs.python.org/library/functions.html#pow
>>
>> No seu caso, você poderia substituir o trecho:
>>
>> x1=a**k
>> x2=x1%n
>>
>> por
>>
>> x2 = pow(a, k, n)
>
> Wow muito legal, porque será q é mais rápido? Talvez seja porque só
> precisa calcular os bits menos significativos mas eu não faço ideia
>

Se não me engano, mesmo que vc não use o terceiro parametro, o pow
ainda assim é mais rápido do que o **.



--
Até,

Luciano

<quote>
"Na prática, a teoria é outra!"
</quote>

:wq!
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Leonardo Santagada
2011/4/28 Luciano Rodrigues da Silva <[hidden email]>:

> 2011/4/28 Leonardo Santagada <[hidden email]>:
>> 2011/4/28 André Lima <[hidden email]>:
>>> Guilherme, acho que você pode usar a função built-in pow().
>>>
>>> Documentação em: http://docs.python.org/library/functions.html#pow
>>>
>>> No seu caso, você poderia substituir o trecho:
>>>
>>> x1=a**k
>>> x2=x1%n
>>>
>>> por
>>>
>>> x2 = pow(a, k, n)
>>
>> Wow muito legal, porque será q é mais rápido? Talvez seja porque só
>> precisa calcular os bits menos significativos mas eu não faço ideia
>>
>
> Se não me engano, mesmo que vc não use o terceiro parametro, o pow
> ainda assim é mais rápido do que o **.

Não sei se faz muita diferença, mas na documentação diz q usar o n é
mais rápido do que fazer o modulo depois, eu estou em duvida se é por
alguma simetria ou algo assim entre as operações ou só porque ele pode
calcular menos bits, ou porque ele pode calcular menos bits e ainda
usar uma operação de assembly pro calculo (o q eu acho dificil porque
o cpython é escrito todo em c puro, só se o compilador fizer isso).


--
Leonardo Santagada
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

André Lima-3
In reply to this post by Leonardo Santagada
2011/4/28 Leonardo Santagada <[hidden email]>:
> (...)
> Wow muito legal, porque será q é mais rápido? Talvez seja porque só
> precisa calcular os bits menos significativos mas eu não faço ideia

A exponenciação de inteiros no CPython é feita usando potências
intermediárias menores (não me lembro do nome do algoritmo), então
cada uma delas pode já receber o mod e a conta fica bem mais barata.

Dá uma olhada no link abaixo:

http://stackoverflow.com/questions/5246856/how-did-python-implement-the-built-in-function-pow
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Leonardo Santagada
2011/4/28 André Lima <[hidden email]>:

> 2011/4/28 Leonardo Santagada <[hidden email]>:
>> (...)
>> Wow muito legal, porque será q é mais rápido? Talvez seja porque só
>> precisa calcular os bits menos significativos mas eu não faço ideia
>
> A exponenciação de inteiros no CPython é feita usando potências
> intermediárias menores (não me lembro do nome do algoritmo), então
> cada uma delas pode já receber o mod e a conta fica bem mais barata.
>
> Dá uma olhada no link abaixo:
>
> http://stackoverflow.com/questions/5246856/how-did-python-implement-the-built-in-function-pow

Genio, realmente não era o q eu achava. :)



--
Leonardo Santagada
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: operador % (modulo) funciona com até quantos algarismos?

Guilherme Freire
Justamente isso galera
e o teorema de lucas-lehman (pontecias menores)
nao precisa ser inteiro eu tava viajando é já resolvi pois o erro era no
algoritmo e não no long
mais foi de grande valia aprendi e continuo aprendendo muito na lista

Em 28 de abril de 2011 11:45, Leonardo Santagada <[hidden email]>escreveu:

>
>
> 2011/4/28 André Lima <[hidden email]>:
> > 2011/4/28 Leonardo Santagada <[hidden email]>:
> >> (...)
> >> Wow muito legal, porque será q é mais rápido? Talvez seja porque só
> >> precisa calcular os bits menos significativos mas eu não faço ideia
> >
> > A exponenciação de inteiros no CPython é feita usando potências
> > intermediárias menores (não me lembro do nome do algoritmo), então
> > cada uma delas pode já receber o mod e a conta fica bem mais barata.
> >
> > Dá uma olhada no link abaixo:
> >
> >
> http://stackoverflow.com/questions/5246856/how-did-python-implement-the-built-in-function-pow
>
> Genio, realmente não era o q eu achava. :)
>
> --
> Leonardo Santagada
>
>  
>



--
--
Guilherme Freire
Analista de Suporte
Soluções em TI
MCDST / MCSA / MCDST
31-86768982


[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
    [hidden email]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html


Loading...