プロジェクト

全般

プロフィール

操作

Wiki » 履歴 » リビジョン 1

リビジョン 1/3 | 次 »
Noppi, 2026/05/11 08:44


ホーム

素数日

;; -*- 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)))

Noppi2026/05/11に更新 · 1件の履歴