短期大学部・総合文化学科 │ 聖徳大学

【コラム/IT】今日は素数日

21.01.07


※詳細はコチラ。また、製菓体験講座の予約はコチラからお願いいたします。
※今後の入学試験の予定や、おススメの奨学金のご案内もぜひご覧ください。(以下のボタンをクリック!)

日付を西暦4桁月2桁日2桁で表した自然数として解釈する素数になるような日のことを素数日と呼ぶことにしましょう。素数というのは2以上の自然数で、1と自分自身以外では割り切れない数のことです。1は素数ではないことに注意してくださいね。たとえば、100未満の素数は、

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97

の25個あります。しかし、今年の素数日は21日しかありません。意外に少ない気もしますね。今日が素数日であるかを確認するコマンド(プログラム)todayp を作ってみました。

% todayp
20210107:今日は素数だがんばろう。

やった。今日は素数日でした。

実は今年の元日20210101も素数日だったのです。そして昨年の大晦日20201231も素数日でした。このように年をまたいで素数日になるのは珍しく、今世紀(西暦2001年から2100年までの100年間)で2回しかありません。あと1回は、2029年大晦日と2030年元日です。今年は大吉の年でありますように。

module Main where

import Data.Char
import Data.List
import Data.Time
import Math.NumberTheory.Primes

main :: IO ()
main = today showPrimeDate

today :: (Day -> String) -> IO ()
today showDate = putStrLn . showDate . localDay
               =<< (utcToLocalTime  getCurrentTimeZone  getCurrentTime)

showPrimeDate :: Day -> String
showPrimeDate d = case filter isDigit (showGregorian d) of
    ds -> case factorise (readInteger ds) of
        [(_, 1)] -> ds ++ " : 今日は素数だがんばろう"
        fs       -> ds ++ " = " ++ showFactors fs ++ " : 今日は素数じゃないね"

showFactors :: [(Prime Integer, Word)] -> String
showFactors = intercalate " * " . map showFactor

showFactor :: (Prime Integer, Word) -> String
showFactor (n,p) = case p of
  1 -> show (unPrime n)
  _ -> show (unPrime n) ++ "^" ++ show p
      
readInteger :: String -> Integer
readInteger = read

<お知らせ>
WEB上でのオープンキャンパスを開催中ですので是非ご覧ください!
 ブログ連続オープンキャンパス(Vol.1~Vol.10)こちら(New!
 大学のWEBオープンキャンパス特設ページこちら
 総合文化学科のWEBオープンキャンパス特設ページこちら

図書館司書・ITコース紹介はこちらから
ファッション・造形デザインコース紹介はこちらから
フードマネジメントコース(フード)紹介はこちらから
フードマネジメントコース(製菓)紹介はこちらから

※ ツイッター・インスタグラムもぜひご覧ください!

PAGE TOP