操作
素数日¶
;; -*- 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)))
Noppi が2026/05/11に更新 · 3件の履歴