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

L-99 (40)

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

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

P40

解答
;;; Common Lisp

;; prog版
(LOAD "./is-prime")
(LOAD "./next-prime")

(DEFUN GOLDBACH (N)
  (AND (EVENP N)
       (> N 3)
       (PROG (I J)
	  (SETQ I 2)
  L	  (SETQ J (- N I))
	  (AND (IS-PRIME J)
	       (RETURN-FROM GOLDBACH `(,I ,J)))
	  (SETQ I (NEXT-PRIME I))
	  (GO L))))

;; 突如On Lispの非決定性の章のchoose-bindを使ってみた版
(defun goldbach/amb (n)
  (choose-bind x (prime-list 2 (floor n 2))
    (if (is-prime (- n x))
	`(,x ,(- n x))
	(fail))))

;;; Scheme

(load "./is-prime")
(load "./next-prime")

;; 折角なので、前回のprime-listを使ってみた版
 (define goldbach
   (lambda (n)
     (if (even? n)
	 (let ((plist (prime-list 3 (/ n 2))))
	   (let/cc return
		   (for-each (lambda (i)
			  (and-let* ((j (- n i))
				     ((is-prime j)))
				    (return `(,i ,j))))
			plist)))
	 #f)))

;; Common Lispのprog版をそのまま訳した版
(define (goldbach n)
  (and (even? n)
       (> n 3)
       (let loop ((i 2))
	 (let ((j (- n i)))
	   (if (is-prime j)
	       `(,i ,j)
	       (loop (next-prime i)))))))

「6以上の任意の偶数は、二つの奇素数の和で表すこと

ができる」というのが、ゴルドバッハ予想らしい。

ということで、任意の偶数を素数+素数という形式に分

解する関数を作成。

ゲスト



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