「素数日」を教えてくれるシステムを作ろう!

素数(prime number; простое число). ←申し訳程度のロシア語要素; простоеは形容詞中性形.

正の約数をちょうど2つもつ自然数であり,話すと長くなろうが,とにかく計り知れない魅力を秘めた数たち.ふと見かけた数が素数だと分かって(Wolfram|Alpha に聞いてみよう) ちょっと心が踊った経験,ありませんか?

今回はそんなささやかな幸せを未来の自分に供給するシステムを作っていきましょう!

具体的には,西暦年月日yyyy/mm/ddをこの順に連結して得られる(概ね)8桁の自然数yyyymmddが素数となる日(以下,素数日)に自動で通知をくれるシステムを作ります.

インスパイア元はこちら(これ以前にも素数日ツイートを拝見していましたが直近のものを)

今日 20200903 は素数なのでがんばろう
- https://twitter.com/h_okumura/status/1301264894516318208

ちなみに,このオンライン五月祭が開催される(と執筆時点では聞いている)2020/09/20, 21は,メイン画像でお分かりの通りどちらも素数日ではありません.残念.

この辺りで本記事の主な対象読者がお分かりかと思います——素数と分かったら嬉しくなれる方,もしくは話のネタにはなりそうだな,くらいの魅力は認めていただける方.その上で特に,テキストファイルの入出力ができる程度に扱えるプログラミング言語がおありだと,さらに楽しんでいただけるかと思います.

簡便のためPythonを使って解説しますが,他の言語でもテキストファイルの入出力ができれば同様のことが可能でしょう. 今は亡き初稿(実績解除: 保存を忘れて原稿9割吹き飛ばす を達成しました……)では全てこの記事に詰め込んでいましたが,長くなったのでプログラミングの話は別に記事を立てることにしました.本記事では私が組んだプログラムの動作だけ紹介しますので,お手元で同様のプログラムを組んでいただいても全く結構です.

「素数日」を教えてくれるシステムを作ろう! - 技術編

無次元
りろっしー

使うもの

  • プログラミング言語(なくてもOK)
    ——テキストファイルの入出力ができるもの
  • Google アカウント・Google カレンダー
    ——通知を送る用.CSVファイルで予定のインポートができる!

流れ

  1. 素数日のリストを生成する
  2. インポートするCSVファイルを生成する
     ——以上詳細は別記事: 執筆中
  3. インポートする
  4. 通知の設定

では既に前置きが長くなりましたが(僕の悪い癖です)始めましょう.


1. 素数日のリストを生成する

まずは素数日がいつなのか調べます.素数であり,かつ日付としてみなせる自然数を列挙し,テキストファイルに1行ずつ書き込みます.私はキリ良く西暦1年から100世紀の末(10000y; yはグレゴリオ暦の年とします)まで調べました(添付 prime_dates.csv: 2.1 MB).

2. インポートするCSVファイルを生成する

前節で作ったリストを元に,素数日毎に予定を書き込みます.ここでは日付だけに興味があり,時間帯には拘らないので素数日当日の終日予定としましょう.

CSVファイルの形式は公式のヘルプを参照:
Google カレンダーに予定を読み込む
https://support.google.com/calendar/answer/37118?hl=ja&ref_topic=3417927

今回ヘッダーに記述すべきはSubject,Start Date,Descriptionの3つです.順にタイトル,開始日,説明 ですね.開始時刻や終了日時なども設定できますが,これらを省略することで「開始日当日1日だけの終日予定」と解釈してもらえます.Descriptionには今後の素数日を載せました.こんな感じ(シンタックスハイライトくんが調子悪いのはご愛嬌)

Subject,Start Date,Description
10240229 is prime!,02/29/1024,"Next Coming:
- 1024/03/01 (Tommorow!)
- 1024/03/03 (in 3 days)
- 1024/03/19 (in 19 days)
- 1024/03/27 (in 27 days)"

1024yの閏日は素数日だったんですね〜 しかも翌日も素数日!
(現行のグレゴリオ暦は1582年導入(←本能寺の変の年じゃん)だぞとか言わない)

Descriptionには二重引用符で括るとコンマや改行もエスケープせず入れられます.

出力する予定の開始日,終了日,今後の素数日の掲載数(上では4)を調整できるようにし,サイズが1 MBを超えたらインポートできないので警告文も表示させました.
"どうせ100年後の今頃にはみんな死んじゃってんだから",という訳でもないのですが とりあえず2020年の頭から2120年の末までの範囲で生成したCSVファイルを添付しておきます(Gcal_PrimeDate_2020_2120.csv: 341 kB).「数分後にまた試してください」と言われてインポートが失敗した場合は,大抵調子が悪いだけなので何度かリトライすれば大丈夫でしょう.「ファイルの書式やサイズがまずいよ」の暗喩ではないと思います.

3. インポートする

ご自分で生成された方はそのファイルを,そうでない方は前節のファイルをこのページ末尾からダウンロードしていただいて,それをGoogleカレンダーにインポートしましょう(パソコンからのみ対応しているようです).詳しい操作は前節に挙げた公式ヘルプ参照.

理由は次節で述べますが,既存のカレンダーと混ざらないよう,新しくカレンダーを作ってそこにインポートしてください.

4. 通知の設定

武器は装備しないと意味がないように,素数日の予定は通知が来ないと気づけませんね.

Google カレンダーではカレンダー毎に一括で通知の設定ができます.
(cf. 公式ヘルプ/カレンダーの通知を変更またはオフにする
 https://support.google.com/calendar/answer/37242?hl=ja

通知をオンまたはオフにする - 特定のカレンダーを対象に変更する」の項を参考に,前節で新設したカレンダーの [終日の予定の通知] に通知を入れたい日時を随意に登録しましょう.前日夜 OR 当日朝 にメール などなど.


はい、これで、ひと仕事おしまい。

ぜひこれからも時々心ウキウキワクワクしていってください.


執筆後記: ところで素数日は無限に存在する(って示せる)んでしょうかね?


添付ファイルについて

記事を一般公開するとファイルが添付できないようなので,代わりにファイルたちへの共有リンクを貼っておきます:

ht...

このリンクやファイルの拡散等はご遠慮ください.また,ファイルの公開は近日中に停止する予定ですのでご注意ください(→ 2023-11-29 公開を終了しました).


メイン画像について

素因数分解は,冒頭にも述べたWolfram|Alpha 日本語版(https://ja.wolframalpha.com/)に投げました.画像は, 結城浩先生の Draft - A Distraction Free Editor with Math (https://draft.hyuki.net/)を用いて作成.数式まじりの文章を書いて変換・画像化(スクショ)までが手軽にできるので,時々何か説明するときに利用しています.数式はTeXの記法を使うので,詳しくは適宜検索していただければ.