No clisp (com a rotina interna) demora bem menos: 1.75 s. Mas demora bem
mais do que 5s para imprimir o resultado :P. No ECL (com essa mesma função
que o Pedro mostrou), são apenas 0.59 s, e o resultado é impresso
instantaneamente.

O ECL é razoavelmente rápido mas não é muito otimizado no geral (ainda não),
mas ele usa a GNU GMP, que é muito rápida, e parece que o clisp também usa.
A implementação de bignums do SBCL não é a melhor possível, embora já seja
bem melhor que a do CCL. Eu até hackeei o SBCL e criei uma função que
calcula quadrados de bignums e que é até 40% mais rápida se o número for bem
grande (se me lembro bem, a partir de 2^(2^15) ).

2009/4/29 namekuseijin <[email protected]>

>
> Compilado e programando assembly em Lisp.  Assim não vale!  ;)


A única função "assembly" que ele usou foi o ash, que é o shift. A maioria
das vezes ele poderia ter substituído por * e floor facilmente (e o SBCL
otimizaria isso para chamadas da função ash mesmo assim). Só acho que o SBCL
não otimizaria a última chamada.

De qualquer forma, ainda acho um resultado bem válido.

>
>
> On Apr 29, 6:10 pm, [email protected] (Pedro Kröger) wrote:
> > namekuseijin <[email protected]> writes:
> > > até 1000 aqui no DrScheme em um Core 2 Duo é praticamente instantâneo.
> > >  20000 são cerca de 2 segundos.  Faz 100.000! em 1 minuto.  A evolução
> > > das máquinas é fantástica :)
> >
> > a evolução dos algoritimos tambem, o seguinte codigo demora 5.341
> > segundos na minha maquina para n=100000 com sbcl ;-)
> >
> > (defun ! (n)
> >   (let ((shift 0))
> >     (labels ((fact1 (n m)
> >                (cond
> >                  ((and (evenp n) (> m 1))
> >                   (incf shift (ash n -1))
> >                   (fact1 (ash n -1) (ash m -1)))
> >                  ((<= n m) n)
> >                  (t (* (fact1 n (ash m 1)) (fact1 (- n m)(ash m 1)))))))
> >       (ash (fact1 n 1) shift))))
> >
> > pedro
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lisp-br" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/lisp-br?hl=en
-~----------~----~----~----~------~----~------~--~---

Responder a