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 |

2008-03-14

ArcでL-99 (P35 素因数分解)

| 17:57 | ArcでL-99 (P35 素因数分解) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P35 素因数分解) - わだばLisperになる

今回は、素因数分解がお題です。

ちょうど去年の今頃、このお題をCommon Lispで解いていたのですが、職場の飲み会で普段は何をして過してるんですか、という質問に、

「いや、ほんと無趣味なんで何もしてないですね。…あ、強いて挙げれば、素因数分解ですかね」

と答えたところ、死ぬ程笑われたことを思い出します。そんなに面白かったかしら…。

私は、数学以前の算数で挫折しているクチなのですが、素朴に書いてみました。

大きめの素数を与えると返事がなくなります。

以前定義したprimeを使用しています。

(prime-factors 600851475143)
;=> (71 839 1471 6857)

(def prime-factors (n)
  ((afn (n i)
     (with (q (trunc (/ n i)) r (mod n i))
       (if (< n 2) list.n
	   (is 0 r) (if (is 1 q) 
			list.i
			(cons i (self q i)))
	   'else (self n (next-prime i)))))
   n 2))

(def next-prime (n)
  ((afn (n)
     (if (prime n)
	 n
	 (self (+ 1 n))))
   (+ n 1)))