Programação com números inteiros gigantes 
Quanto é o fatorial de 5? 120, fácil, não? E quanto é o fatorial de 6000? É um número com 20 mil dígitos. És capaz de escrever um programa que calcule isto? Depois de ler este artigo, você será!
[ Hits: 206.071  ]
Por: Elgio Schlemer em 13/08/2009   | Blog: https://elgio.prof.nom.br/~elgio 
 
 
Dividir para conquistar 
A ULA não suportar informações maiores do que 32 bits (ou 64), não significa que não se pode ir além disto. Significa apenas que ela mesmo, a ULA, não consegue lidar com um número maior do que isto de uma única vez.
Para explicar o conceito, que tal pensarmos em qual o tamanho da nossa ULA?
Você consegue, com a "sua ULA", executar esta operação 059 + 064?
Se você respondeu que SIM, desculpe, mas você errou.
Tipicamente "nossa ULA" é de apenas um decimal. Só conseguimos lidar com um dígito de cada vez. Quero dizer que desde a primeira série aprendemos a usar o conceito de dividir para conquistar. É provável que você, para executar a soma anterior, usou a velha técnica da primeira série:
  0 5 9 4    primeira etapa: 9 + 4 = 133  (e vai um)5  96  4   segunda etapa: 5 + 6 + 1(que veio) = 122  3 (e vai 1)0  5 90  6 4   terceira etapa: 0 + 0 + 1(que veio)1  2 3 (FIM) 
Sua ULA é de apenas um dígito! Você precisou decompor as operações complexas em várias menores para conseguir resolver.
O mesmo conceito se aplica para qualquer processador. É possível, através de programação, fazer uma operação complexa dividindo ela em operações menores, cada uma suportada pela ULA.
Em um passado distante (2003) eu me aventurei a programar funções que manipulassem números grandes em C. Eu mesmo defini a estrutura de dados e as operações. Pode parecer bobagem programar o que já está programado, mas precisava para entender bem o conceito. Cheguei a implementar o que chamei de BIG_Soma e uma versão péssima de um BIG_Mul (lenta que doía, pois fazia X*Y somando X nele mesmo Y vezes!).
Na minha modesta e bugada biblioteca, eu defini um número BIG como um vetor de inteiros. Se quero representar um número de até 128 bits, lá vai um vetor de 4 inteiros (32 * 4 = 128).
O interessante de se usar isto no C é que tudo precisa ser implementado. Não se pode, por exemplo, imprimir um número grande com printf! Tenho que eu escrever a minha versão do printf. Como nunca cheguei a implementar a função BIG_div, também nunca implementei o BIG_imprime!
Mas deixando esta minha experiência de lado, em diversas linguagens é possível trabalhar com números de qualquer tamanho. Algumas de forma incrivelmente fácil, como no caso do python, outras com um pouco mais de sofrimento, como no caso do C.
 
Páginas do artigo
   1. 
Introdução 
   2. Dividir para conquistar
   3. 
Esse Python! 
   4. 
E existe algo que o Java não tenha? 
   5. 
Comigo é no C Ansi 
   6. 
Conclusão 
Outros artigos deste autor
 
 
 
 
 
Leitura recomendada
 
 
 
 
 
Comentários
	
		
		
	
	
	
	
	
	
 
	
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Este artigo foi escrito para dar uma luz àqueles que pretendem ganhar o livro!
http://www.vivaolinux.com.br/topico/Seguranca-Da-Informacao/Desafio-2-RSA/
Antes, porém, uma leitura ao artigo http://www.vivaolinux.com.br/artigo/Criptografia-assimetrica-com-o-RSA/ se faz necessário. 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Nossa, elgio. Parabéns, novamente. Sempre esbanjando conhecimento e método. Parabéns pelo artigo, muito bem escrito, incisivo e útil. Por favor, continue assim. Vlww 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Bahh, esse cara só escreve coisas legais! Fez renascer meu interesse pelo vol. Eu já estava cansado de tanto "Linux para iniciantes", "Impressões sobre o Ubuntu", "Instalando o Kurumin no Laptop XYZ", "O software livre é o futuro" e outras bullshits repetidas. MASSA! 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Cacetada! Pedi pro script python exibir apenas o resultado final e executei ./fatorial.py `./fatorial.py 1398273683131` há 30 minutos e nada!! Será que algum dia vai terminar? 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							bpiero: logo logo o programa irá ABORTAR por não ter memória suficiente para alocar o resultado!
:-(
 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Mais uma! Utilizando o programa em C para calcular o fatorial de 100000 e enviando o resultado para o more, comecei a visualizar aquele número interminável grudando o dedo no ENTER. Acontece que deu pra perceber claramente um padrão na imagem abstrata formada pelos números subindo pelo monitor, pareciam fitas enroladas em hélice, simétricas e contínuas. Bizarro!!
PS: adicionei uma partição swap de 40GB para terminar aquele cálculo anterior, pois sou brasileiro e não desisto nunca, hehehhe 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Excelente artigo. Programando e brincando. Minha professora de java simplesmente me disse que usasse o double.. nunca nem se tocou que eh uma questao da estrutura 32 bits....
Quanto a seus artigos, são realmente ótimos... como disse um amigo acima, fez renascer meu interesse pelo VOL. Todos os dias abro o site pra ver se encontro interessante que vc tenha escrito. 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Parabéns, Elgio.
Muito embora não passemos toda a nossa vida calculando fatoriais, certos conhecimentoss são muito importantes, tornando-se isso por vezes o fio de alguma meada ou o próprio caminho das pedras, ajudando-nos a solver outros tipos de problemas...
É o conhecimento que diverte, ou a diversão que educa: Não importa a definição.
E tem gente que faz muito mais que simplesmente escovar bits: 
Trabalhei em uma indústria onde o controle de estoque somente era possível através de uma técnica (em linguagem de máquina) que dividia cada byte ao meio, e cada metade controlava um produto diferente.
Observe-se que para isso uma das metades ( a que contém o registrador SO ) que tinha de ser "enganada" e usada integralmente para armazenar dados...
Já não me lembro como se faz isso, mas a coisa era por aí.
Detalhe: A memória total era limitada a 512 bytes.
Não fui eu quem implementou esse sistema, mas alguém o fez, a partir de alguma idéia e certamente de bastante transpiração. Criatividade, conhecimento e dedicação. Muita dedicação.
Então, conclui-se que algumas coisas que podem eventualmente parecer "inúteis" , "supérfluas" ou "doideira" (como calcular fatorial, raiz quadrada, dividir bytes ao meio, etc.) poderão ter o seu dia de "Eureka!!!!" bem mais cedo do que se imagina.
A propósito de Python:
Existe um software homônimo (um personal messenger) cujo logo é o de uma  serpente de aspecto terrível, com enormes presas inoculadoras de veneno. 
As pitons no entanto, assim como as jiboias e as anacondas são constritoras e não possuem presas nem veneno.
No entanto, o nome da linguagem Python não vem da serpente, sendo apenas uma alusão ao conjunto Mounty Python...
Desculpe o pythaco...
 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Caro Elgio, você acha esses números grandes ????
Veja o que siginifica GOOGLE. Derivado da palavra googol. Só a título de curiosidade. Gostei muito do seu artigo. Acho até que você já sabe o que é GOOGLE, mas ... é interessante a história.
abçs 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
		A matemática é algo incrível.
A computação é algo fascinante.
Junte matemática e computação e tenha um dos temas mais instigantes do universo.
Exageros à parte, encontrei este link
http://gmplib.org/ 
que contém um material em pdf
http://gmplib.org/ gmp-man-4.3.0.pdf
para a biblioteca GMP (GNU Mathematical Precision) que traz diversos assuntos interessantes sobre cálculos matemáticos com números arbitrariamente grandes. Dois deles: o algoritmo para cálculo de raizes quadradas e o algoritmo para o cálculo de raizes n-ésimas.
Acho que isto resolve o problema de não existir tal função na biblioteca bn.
Até mais!!
	
 
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							A matemática é algo incrível.
A computação é algo fascinante.
Junte matemática e computação e tenha um dos temas mais instigantes do universo.
Exageros à parte, encontrei este link
http://gmplib.org/
que contém um material em pdf
http://gmplib.org/gmp-man-4.3.0.pdf
para a biblioteca GMP (GNU Mathematical Precision) que traz diversos assuntos interessantes sobre cálculos matemáticos com números arbitrariamente grandes. Dois deles: o algoritmo para cálculo de raizes quadradas e o algoritmo para o cálculo de raizes n-ésimas.
Acho que isto resolve o problema de não existir tal função na biblioteca bn.
Até mais!! 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Parabéns elgio!
Ótimo artigo, nossa, sempre leio seus artigos e acho ótimos.
Por favor, não pare.
Abraços
 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Parabens pelo artigo, muito bem feito.
O tipo Integer na linguagem Haskell têm precisão ilimitada também. 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Olá professor, parabens pelo tópico
venho acompanhando seus topicos relacionados desde a criptografia RSA, materia relacionada com o que eu pretendo apresentar na minha monografia, criptografia quantica na verdade.
Gostaria de saber, se por um acaso, vc ainda tem os codigos "extra terrestres" aplicados na maquina virtual java para trabalhar mais rapidamente com numeros grandes, pois seria de grande valia para mim.
obrigado
e mais uma vez, parabéns pelos tópicos 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
		Olá.
No artigo eu usei a palavra extra terrestres para uns parâmetros de configuração da máquina Java para executá-la mais rapidamente. O contexto era um desafio a um aluno, pois havia dito que java era lento e ele me provou que pode ser tão rápido quanto o C. Não uso Java e nem lembro mais deles, mas posso dar o seu contato a ele, caso queiras.
Quanto aos códigos, como este artigo foi uma ajuda para o meu desafio sobre a quebra do RSA, os códigos que permitiram quebrar o desafio já foram publicados no artigo do vencedor: 
http://www.vivaolinux.com.br/artigo/Quebrando-a-criptografia-RSA/  
	 
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Olá.
No artigo eu usei a palavra extra terrestres para uns parâmetros de configuração da máquina Java para executá-la mais rapidamente. O contexto era um desafio a um aluno, pois havia dito que java era lento e ele me provou que pode ser tão rápido quanto o C. Não uso Java e nem lembro mais deles, mas posso dar o seu contato a ele, caso queiras.
Quanto aos códigos, como este artigo foi uma ajuda para o meu desafio sobre a quebra do RSA, os códigos que permitiram quebrar o desafio já foram publicados no artigo do vencedor: http://www.vivaolinux.com.br/artigo/Quebrando-a-criptografia-RSA/  
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Olá elgio, desculpe a demora em responder, viagens de final de ferias =D
Por favor, passa o meu msn a ele sim. Ficarei muito grato. lucas_siqueira@live.com
O meu interesse seria mais na área de agilizar o java mesmo, mas vi o tópico e assuntos relacionados a criptografia que vc postou (infelizmente depois de já terem acabados). Tivemos que fazer um trabalho semelhante na faculdade e daí que surgiu o meu interesse mais aprofundado sobre o assunto.
obrigado 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Sem querer ofender nenhum amante e defensor das outras linguagens, mesmo porque, ate mesmo o autor do artigo nao fez menção a isso mas pra mim so mostrou a superioridade do C em relação as outras linguagens. Vejam bem eu entendi perfeitamente o que o escritor desse artigo disse. Mas vamos combinar:
Fatorial de 80000 em C calculado em 18s em relação ao Java 1min e 14s e ao phyton 50s!!!!!!!
Na boa gente sem querer humilhar e uma goleada das grandes!!!!!!
Mas cada um usa a que melhor lhe convem. É como no futebol já ouvi muito por ser flamenguista, mas é o time do coração e não há o q dizer!!!!
E viva o C 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Bem legal! @Nitro, obviamente python e Java são mais lentos que C, é claro que dependendo da circustancia e do programador isso pode variar, mas lembrem-se java roda sobre uma VM e python é interpretada, então é natural que C, sendo compilada e rodando diretamente sobre o sistema, seja mais rápida que elas. O problema maior do java não é a linguagem, mas a Swing, acho a swing bem pesada e lenta, mas até que é uma biblioteca legal de se programar. 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Atualmente estou pensando em me aventurar por assuntos da criptografia e esta era uma dúvida que eu tinha. Como manipular números com tantos algarismos. Fiquei surpreso com C vencendo Python, mesmo Python oferecendo o recurso na própria linguagem. Bom artigo, parabéns! 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							100% excelentíssimo!
acho que nunca vi nada tão bacana e bem explicado por um professor! 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Se não me engano (corrijam se eu estiver errado) as linguagens Haskell e Mozart (Oz) tbm tem suporte nativo a esse tipo de coisa. 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Prezado professor o fatorial de 6.000 é este número pequeno abaixo.... kkkkkkkkkk.
professor gostaria de orientação, para aprender a programar em C++ um bom manual, passo-a-passo, tipo do CLIPPER... Mas algo, como criar uma agenda, uma calculadora em ambiente, de texto e gráfico.
26839997657267395961163166474627355122050186046884725685824261445661070965868578859479409748346329836182703089128852632609939583160469201526637034786976396625075825887529584878861523984702266296018595427551580174654216923424895644549809732165397549500287960097044436776098097112285935902002318300817766074944639865419157280524790653203290253917356133633993978535760253069357555142219669129998317026518032402810751448010557484004254745274140263837210122325107062378927575415179640798325598920907738968963426553833519168033920097139867697345016081563676374441238664213080213666256929097791375199485350231595456497900149202746728755327879812971546373369370677385700341673192285360910112728679385205719710580583641371671892447976818829243817888754721448962887123232268424960754147650482415903026606790467209849563662271416952282649322598751397802523984319920253594583722082455006753362159905925741054970039726329277310783778301896111639647389105189524695731748039744831330171194849813750142198591661331367731897270827642663650121154179844927245869455452866090540869550194618984743649127756540595329147696682931012739858611204283134522143082978255200048338318229115382675077435011021122203657208296645354100711784246537108376427936888332083853865732544562471022466209428262367892766813822586238730884186670640599681155203053263579261264327036948384088756702762253306671361116697006843642834443792187068184967415329762543330480264694132001091536593658869788389814480927116885215169756787073551910689019283750895017493228111116730310828166766041200531056382164323390539713295116741388483967745305691786537941332339818667917676571370007419397773475261943894514052312932289624661769878012350676494947730866831924804552851197759345191254081631464738416269147789847963818212281155896550427170387285980460490951645441243497814514002972833731020681426095160149778141037573688491521442522428544788969389558278761397481348218877157739113180534110050023212126419438699172726154425655036249509154341846353246115757571655397172997888622515217725681355507009805113242461343462749671452788638077124750445775923725491807857904696015889810582915109267213212215315203713159208649674164979719727312920576511559196470602174361303899231649894912510856185814740917226239172072546201539584906050452246863211300948544262550662310529984226992582651085151214806862737544037624184170092436908438597773909311650839302124106743539756133701430549822835175979119647543081774334757846025648778275567966409017115828239278838608964398135300219592308860564771741370352802721328544196035203258913677288304583292026902650292022615233949477454247380613913727205962978808266843078181782521529295663178723309967551512319985570114605975081675370544606833051518171905908225228981315998888508641383754110684161710540379573862750847847505118932108687343116259504882707915331968334989766476215094439032763933829258296825600807659383396331656916379451344784802449899227776335723347766390689666241963170367393391210821232042808302473264063265570110727719831475689561404967877066430429903848880193864377881446218231571439631758568428463947148118858717809903748434222683956452043663618862381077166736163904143611771876372531590296726023035330673799952066924105529602223046628759245420801826722083980921568005211239250818157044712443998577051201694386666676548459139059534955603452332498091561411572853622851267073396054099014969366801494527706537595304138848480664476770533265090362642331386328673912578619209255162812445589840156651576378448310470200887299943392878434964998167663977882887221263096306624719352570216017537901919095997174491423825076915901844828299728867068358932893173855581339383152432283675932309139108086846506216370866033080621523840531146755934097307408215697024409051687603668777226806830415433795410593140890416931031058084357039568102702638999494225749379427539899477901253728525589333527959277554441588267988641971876672848522278885432950000713174717818564119905187925226030650056997215832606755915139333987912157419842331744288642889962577622559173461092061337782792800669889998655960852746942113164577327334884576755813786481634749877236127180350856907734255684011438108061579128976722956572293429802773951504460935383493894278312699763923245547175663397346989022015320010667525912457679400581483705019548056855672703674896854737678203776369140756376089462449280006665661035666006921950987386872094427675301957693502233910568049172906194746954125886626269172858815989476855674311523872846329821400400763827646130537527272350995090929517107381022804145383611938945290186877390668234661029799097681602379568029119838560091291614083678024113699512262414222827129371338079435110215172704049731560918699244509728283556069827037741673013342110878227016581208632447654168805338374785489229037504121557638213364969795134613946880198143598744934254049047652000435648260460315689718953671559931084783230022864563599174390561242416515649909885274704141042481089882030312456111711513802717240135242476854435918803605162485964256860285707437162161523150880602244588082288703552459412578484347249931541710133937268355470525564025317366479302263333297793229701722268518487745423309476454825885688563656328669909328960726227217746513974012608523837157894646126497155495847558779670772281055345753896529609284835447408379437232766596325245729441678426804018266486446041738028201210588974259726818731212691907209410450960012489269359303557141418261872878840153018432632743047491241142213154307261531976744986085767078659204961267418144728791274812585877377270787860181952296269435846032835432665015604490686890958244706686381824599477501861516682019378871555372510865803678658691697941102766320731311969158487304120286437862145736732394203678256089895044788570688165095904488684541547213265814760800903192224668435587633646241787956794671777024535537548677669344734391033706602943613442496123847673685078921583639566511433247002826913206025495210184332820453059341772597886542104466355672414361321525270662898671590256225316736799329288004282209029227977496988338803694599926602334918886851384115767529046261566167879067415004412013981026431670302781024110519975053809251441552664436695119607254616839235405097220832844999496406932610321750880717707526257155144479558265577121457883354130966058460949905183541920784685810495511824633564623203622545752285048322601540147114940477282319089885604719594322274307570377569828497611795106065649907604825505236501660518162575599118468736316043306834159987187831281295962021538609891359958084877685159675050166947628016488026431953172281900387230968173782146563168653588630286211011668433441333823075581919363824362932880427831430556053108507046246421196140219366978834558974462588436923645529385600025541518596699322797933616685250622157597463243707453327414164942163090126405769853433010109206938295039098203538385660049440677153410981199879428054550229069777536610109500673593952523016334494523561068250729979121779184363748140628442779681000417566359474204167681174820176728969043370649673522631060265357110075973952347360362984289840155659432230548753561511108669634362621654405756411713538358908721730705960390405977938491036511919613427919440128566811728681598359611378946010125676443438082247070490023185084235213042639811189709583244714164597763501116307625848095008701493449513079965992954097684158860941655430946986067589018614170778141474686227232765295039894254082902355866495212825729079245813851076586228786055451349969723070416315974239445690393038118202725795105519781134231015178521890424346496650894181117354609245262021371137195676841189511521902507335137574217501870437614126135353094126084804313051200792975952140413789628883243769036385641778001621627161816525820367941544906943954307963287899647807608555063949916962195279711901809586155318819699397668051655460229580017948563694384203283404278464809965543259459238690367209746182768863741318400635630079422528479763675001256831936882203374586645618033291782515494021505175038624781840272794622469978853958785054623954499516285871397211907425386069707751534411059083177014806958625176529207667888992864932992747415768392548848256304173508923017783002188862774976889301189512631658135171879154140083392136382819310890513335161935706439544652866330201623448052563814824077603326355508933605604424600448291508530124857820023813927063948608641347736250592506112490756973272230629775646381758420315977437335059628471695549795691293756712366294481331175001245733081851145135484800803418840241315976099255095439620940223136901994965329154153506574920570848498252125571529713557668092811195646136559978088820601346208029112370733158792968907458126312371445670688267987605112516475243208816963302038466447547681765253439647124033397270561625609556398590434964457944954309646474894650904853218921957202959530304641111659297682838865324856282312400884964347702070305433879310515186656471481638169102808581722273535412432597450682370732570982895174461945607104365181581376611951264796184795738549839706427908331191819986570317688182995627653773550817877954776508879127635456487418504926881654920604279454152324325660886511272516911299135838141087303316226745988807478038370462171963678341308873095934247673904776115988991225795671253759564756119735443325022586469345409028644380587414699081655676862737273868437940818179561003406992360965199467481546972908696465933739781519701659242335232356415466038443338391940395961378869736803878457355977659711442530839903609720790079863076058058715425763090531370117042825661461468549528115981158562216417882781509664853084610831510279505043600822370480590602567198336194062784913269731422406383973451453248248130283541310749558344183861427625568458608812548097423428774920090092328407439640342723637863396368920858582855416845188111542427327700990645690098745755247279065598056279137864634712015208857329539219829853397466428466858279087009752509271828426898571834909681863109405566656445800488441033946511794342431604565168864967057267397568220363992954730588476055451427487747065978279654894963593073322993554421804132579318498274537173107483494533189509118093004443180291631727515000642142157865267493042953936254541488985234518070473671110935727926968656415152473303726109624468629752844760557073833637378230650501221082633697198807510860468850341272344748512661777090799274894787545289009052176976539368742406207723182280541002309464890868562316823514637242729903960306443521003257332856088639395551668126821383301629329766797786756596435530484560778049737215792030674205303205801908027014371344418997505156595085966936182094633009369957887739382905617186959592994679436161215891491201560010002303562861512545655665533747304126090814958091971128086726263385122624660641970132348294803564477594695720793602492116938354646938946023345419380616330196587711018244015684782598722707267350042318261118692659787623138728964220486865730904538203308544993585204324572483911221951329505157910024779477100406637724879026557148888479697973570421165075760846187884313379621653231257431521388920581117855569927930918809429389097758561316947040253818657366569583216996595880452085181969727435761566711982292456039046952519493321075973470394810159148251758971126592230257412888072670817718837506735539095364155132814201524878117711434829903313602637604260588611935665177670745833721998953303904895239132068265377922420627009779809889466755971872455555671343784690265355346881170795850018502852129370131161465211107369431679795035652082821361480112682380161016649435674734177637483728801571862040064044726291609723825892762153360165674913318950680706277824100457440373632584431075427676529506977563628228527378494844207021130124323451315757493502535786767998535944780419236802727365935448267569554728569057360166647462125575250193177849662065112241470787761620611464498899026682166757218791373813761401747102822467889867257511968031588511731267040532584303876277822386722669253577220369208701354730560681156009035093927791766748395744314207149124473135012255460731267410179450581153432937372865433287334462578361944819245261635417883590093899730240806210512987059139039755719239516747955096168654356635774845296249238132200083290844308330305768505442081037956814356669229273485720031048841792343104465806889538587267438148348731529650107764155019749250703132742148481239788685811391010900182490909954694363129618125365471934712122838075498656865915837228681461906354109534852326705549753619056082390581591133714455250473306727306242271394575288348548899421857457448892069402326062432879273585649517014441861740184183732637647917145400133596746174058308263937278934908107861989223858703458125139822476496470077529071243260203480002394510173588464682577409130875845159623990027664682239590745295239264283065594285434091436489253442921825135707791449628982248064677091483840909115145896107493834857848808071214338290234872083621079923598950627418060690376874046447264041880157359247953759911121569430096089834446296806860114670291023641209580290186092260745512341049839125320156048602734609882451486484322548326755005290081487345389836313565927731311793288362110072115999613152199117256916818999608708250621912549461311254907765260632070362318972418308599585793874193787083482250701523909384993325593106521905136810593360648610894682072245554224301126571410508286122161010810045817773370919374379062289989596224173452184331945051277917796601154892023168491463596096169598616821643671175696854206049100409006169078167430243904473349850147863726706105693676072525164576151294211311629974748183761004606695897909323902577614980463372076919222259328236178404969041379181515374344242733626249558454232062869892488352165799933907917509540768234595160387324388181683690007433113673985430304052495927693685462083670005908633301178630874993739635956858976116348960179166726796605516490861400434448117862153583360984970496289282786486924122320805439939104334341019564178399582455126220556116076741160779832290603975886951147801032161856144959140749293512916086914534660610841694647041611561923866814230934483566399542264717552387574974421387272230796502177946284221874524930330498681663359921010552038845486760571928329559123276961732134968947802118912623447421785908853884067148125440069829365065220130190616955378432426153891483828105402950511840637876877234184400942653059494517924357669899733289658380086660623384775909557622020560227651865360538523553843745107362962392805230202092309660311635156423561540681110235178761462251944120644292834726236559729720149026752335625188787684395265448115729660748799089328448221254102231043203399148743725714335765832853961835178566475440498860100869638052637605743373122008063627879684909029232858931089061916343578608313417391750989970302069749103922130012341608004119286343965424842059261793368728098393595453691033567327108159117557620000953888329412084429827988048791349759502464645602759589914538960491613793478214629274343372792133917392650045082328532754264581760884356541693444000522135818927662083734901101455655254750765419245440999083696076591953649097658590724853350795572415019126863241169128496172523992207344038102394497164800269534560712698912118761394346980783745339986140508718446774224385072467747565302711974864997611631470554269949908627401966447196716914845339410483869892524887982754042429506250673628968228718414012061643077451598342070312729529554773622909551294617485271223447001479812256152081338761827213750484285102947543191716410061394064195110279165734257137718743900404114109584078987879890440446197685164429076990775186914399945755358951691014258339827760688101039687288938837826076976979306089014797721238103646612279704260840216938322762615799981033899782421339230193365498507592907351317381230515558484120284158045864263284108686716827733330001944050406926490472871149620911685246815731101319508907675308813751230736133469124878367785484098823175312278896475273717682187775471894949719361716988670517703295238021800981249818686821379075877402467161140894884709253873700243744595822568080593124662675402754125916201532030537520491201173394159061364948483059596580316726712605307448924989087569963854988789985035890309396965302398195067375747112091617600630569062324899570087096741838973750680880832943381845733445043322194272393030455106292621745244865065398232650227634039186524858034442435811685990620469599080320964512829736284194196458596854413094883125022632141852377393629837683566291882367008185503452296814405791004709850786420099334456302025779045784575829371702458061571747687640159115139743805106923198622400343083944895587534294586812991787254524635520715077762098659988456250623733754110464719122690522791780240030691459123414760105186968091990914114056819616384834492304501039162508627073767169780478967830496186463014833978072637257898856860747927869572485404472280339434886585112737960619322714849939180667763616427956312853138705840775032899047093993945041239132207332617958940173285759309420189320639459634009108821270840450430079776452768788377382406303880576440235086778433484851147247590306073275962761489160541273044410581057507318552527566462489287493173796287417367511276543141860934682205107397952449995571915189415486555443905015245009447583374122394632411846254123646430760547330754177908127719307103338704379090318774174414339548060789758654183769135018414808654059391380421542898999289131982752881304432914119165614021131474301910193653981743294360179900258947239179416931113274497477055056916721815325178771881770427595574526979969110609812671390052073967371528725049419557297254899779063252161056890215846180637435165931765123585887180135444817679943914033515786523995512366445378614290524518063186195499410292577340893661060140730842547355544924489906477904545600765784171496375614289338782329243001810188831870754174818902702669589149513609444235544045909168745079904116721850001084293630774744710684207973526258512853651361135504092112982975885188330480138649740482126293824415540863298341430414394251739591197379088280472305756923345573771556994641103276622032051635549987509769751669795304800617960120841579720909823273146247520919870094496829700346067978778444534370898712922626727560847873952959479373409336411773191732428874668314482333129065714938545538758040915539353017303882622304962799500823467650949423108117514476739529568772483484088052527412492835298965051496826879243767284255331909921087629905226018279220902892396229790261576968836481928703175145314086183266916645372130046603087776005949156839867209518985438312000494875144235247146892718470881434056042405573649073820901746077355841968175323686311247214811449866295517680784346062675700080180133241281272872960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							E por falar em programação, que ira programar os computadores quânticos? rsrsrss
Muito bom artigo!
Cristhian Bini 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Mesmo código em C, mas usando a biblioteca gmc, do gnu.
Necessário compilar com -lgmc
#include <stdio.h>
#include <gmp.h>
int main(int argc, char *argv[])
{
	mpz_t fat;
	int f, i,j;
		
	mpz_init(fat);
	for (i = 1; i < argc; i++){
		printf ("Fatorial de %s = ", argv[i]);
		f = atoi(argv[i]);
		if (f<0){
			printf("ERRO\n");
			continue;
		}
		if (f<=1){
			printf("1\n");
			continue;
		}
		mpz_set_si(fat,1);
		
		for (j = 2; j <= f; j++){
			mpz_mul_si(fat, fat, j);
		}
		mpz_out_str(stdout, 10, fat);
		printf("\n");
	}
} 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							E ninguém se lembra do fortran, que foi feito especificamente para essas coisas. Tá bom então  =( 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Muito massa Elgio!
Parabéns continue assim sempre trazendo novidades..
Abraços!
Excelente Artigo!
Yago Portella
 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Muito bom, parabéns! 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							No Python ainda podemos reduzir ainda mais o código !
num = int(raw_input("Entre com um numero: "))
print "O fatorial do numero digitado e : %d " % reduce(lambda x,y:x*y ,range(1,num+1) )
http://vivaolinux.com.br/script/Fatorial-de-um-numero/
Parabéns pelo artigo!!! 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
	
		
		
	
	
	
	
	
	
		
			
				
				
					
					
						
							Mensagem 
							Comigo é no GNU Bash:
$ time seq -s'*' 1 80000 | bc
(...)
real    2m21.791s
user    2m21.382s
sys     0m0.015s
$ time echo "a=1;for (i=1;i<=80000;i++) a=a*i;a" | bc
(...)
real    2m22.936s
user    2m21.542s
sys     0m0.973s
Lerdão...kkkk Mas funciona... 
						 
					
	
					 
				 
			 	
			
		 
	 
	 
	
 
Contribuir com comentário 
 
Enviar