プロジェクト

全般

プロフィール

Wiki » 履歴 » リビジョン 2

リビジョン 1 (Noppi, 2026/05/11 08:44) → リビジョン 2/3 (Noppi, 2026/05/11 08:44)

[ホーム](https://redmine.noppi.jp) 
 # [[素数日:]] [[素数日]] 

 ```cl 
 ;; -*- coding: utf-8; -*- 

 (defconstant +start-day+ 20000101) 
 (defconstant +end-day+ 20991231) 
 (defconstant +day-elements+ (1+ +end-day+)) 

 (defparameter *calendar-number* 
   (make-array +day-elements+ :element-type 'boolean :initial-element t)) 

 (defun eratosthenes () 
   (setf (svref *calendar-number* 0) nil) 
   (setf (svref *calendar-number* 1) nil) 
   (do ((n1 2 (1+ n1))) 
       ((<= +end-day+ (* n1 n1))) 
     (when (svref *calendar-number* n1) 
       (do ((n2 (* n1 2) (+ n2 n1))) 
           ((< +end-day+ n2)) 
         (setf (svref *calendar-number* n2) nil))))) 

 (defun primes () 
   (eratosthenes) 
   (do ((n +start-day+ (1+ n)) 
        (result nil)) 
       ((< +end-day+ n) (reverse result)) 
     (when (svref *calendar-number* n) 
       (setf result (cons n result))))) 

 (defun leap-year-p (year) 
   ;; year % 4 == 0 && year % 100 != 0 || year % 400 == 0 
   (or (and (zerop (mod year 4)) 
            (not (zerop (mod year 100)))) 
       (zerop (mod year 400)))) 

 (defun dayp (n) 
   (let ((yyyy (floor n 10000)) 
         (mm (floor (mod n 10000) 100)) 
         (dd (mod n 100))) 
     (case mm 
       ((1 3 5 7 8 10 12) 
        (<= 1 dd 31)) 
       ((4 6 9 11) 
        (<= 1 dd 30)) 
       (2 
        (if (leap-year-p yyyy) 
            (<= 1 dd 29) 
            (<= 1 dd 28)))))) 

 (defun prime-days () 
   (remove-if-not #'dayp (primes))) 

 (defun prime-days-2026 () 
   (remove-if-not (lambda (yyyymmdd) 
                    (= 2026 (floor yyyymmdd 10000))) 
                  (prime-days))) 
 ```