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-17

ArcでL-99 (P37 オイラーのφ関数 その2)

| 03:34 | ArcでL-99 (P37 オイラーのφ関数 その2) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P37 オイラーのφ関数 その2) - わだばLisperになる

今回のお題は、P34のオイラーのφ関数の改良版の作成です。

phi(m) = (p1 - 1) * p1 ** (m1 - 1) + (p2 - 1) * p2 ** (m2 - 1) + (p3 - 1) * p3 ** (m3 - 1) + ...

という式を前回作成したprime-factors-multを利用して実装します。

今回、ふとArcの構造化代入ってどうなってるのか試してみたら、7年前のプラン通りにletに構造化代入の機能が付いてました。

(let (x y) '(1 2)
  (list x y))
;=> (1 2)

そうだったのか…、全然試してなかったな…。

arc.arcを眺める限りでは、letの定義でも、withの定義でも分解している様子はないので、fn自体に構造化代入機能がある様子。ということで、

((fn ((x (y z))) (list x y z)) 
 '(1 (2 3)))
;=> (1 2 3)

こういうことも可能だったんですね。知らなかった…。ということで、今回早速試してみました。

mapで使うと便利ですね。

(phi 1192)
;=> 592

(def phi (m)
  (apply * (map (fn ((p m)) (* (- p 1) (expt p (- m 1))))
		(prime-factors-mult m))))