|
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] |
|
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 |
|
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/ |
|
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 |
|
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] |
|
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] |
|
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 > > > |
|
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 |
|
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! |
|
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 |
|
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 |
|
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 |
|
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 |
| Powered by Nabble | Edit this page |
