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))) ```