Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-03-24

L-99 (38)

| 22:14 | L-99 (38) - わだばLisperになる を含むブックマーク はてなブックマーク - L-99 (38) - わだばLisperになる

L-99 38問目に挑戦 - L-99:Ninety-Nine Lisp Problems

P38

解答
;; Common Lisp
(load "totient-phi")
(load "phi")

(macrolet ((1000-times-time (func)
	     (format t "~a: ================" `,func)
	     `(time 
	       (dotimes (i 998 ,func)
		 ,func))))
  (1000-times-time (phi 10090))
  (1000-times-time (totient-phi 10090)))

;; Scheme
(load "totient-phi")
(load "phi")

(let-syntax ((1000-times-time 
	      (syntax-rules ()
		((_ func)
		 (begin
		   (print ";" 'func ":================")
		   (time (let loop ((i 0))
			   (when (< i 1000)
				 func
				 (loop (+ 1 i))))))))))
  (1000-times-time (phi 10090))
  (1000-times-time (totient-phi 10090)))

P34の実装と、P37の実装の効率を比べてみよう、という

お題。

比較結果は、

(PHI 10090): ================
Evaluation took:
  1.78 seconds of real time
  1.291522 seconds of user run time
  0.022033 seconds of system run time
  0 calls to %EVAL
  0 page faults and
  458,512 bytes consed.
(TOTIENT-PHI 10090): ================
Evaluation took:
  5.893 seconds of real time
  4.627227 seconds of user run time
  0.047596 seconds of system run time
  0 calls to %EVAL
  0 page faults and
  0 bytes consed.

で、工夫したものの方が3倍強速い模様。

Gaucheだと、7倍位違う模様。

比較作業中、P34とP37の結果が違うことが判明。

良く調べてみるとL-99の問題の式は、

phi(m) = (p1 - 1) * p1**(m1 - 1) [html]+[/html] (p2...

と足し算になっている。

オリジナルのP-99のサイトを参照してみると、L-99の誤

植で、本当は掛け算で、

phi(m) = (p1 - 1) * p1**(m1 - 1) [html]*[/html] (p2...

が正しい模様。

ということで、P37も修正しました。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20070324