曜日計算を高速化する新アルゴリズム、既存比3倍速を達成

A faster way to calculate the day of the week

曜日計算を高速化する新アルゴリズム、既存比3倍速を達成

日数(rata die)から曜日を求める計算は一見単純ですが、高速化には高度なビット演算テクニックが必要です。本記事では、乗算とシフトを組み合わせた新しいアルゴリズム群を紹介します。これらは従来法(Neri法など)より約2〜3倍高速で、x86ではわずか3命令で計算可能。ISO形式(1〜7)も同じ命令数で実現し、32ビット符号付き整数の全範囲をカバーします。また、この手法は2^N−1による剰余演算に一般化でき、時間計算(%24や%60)にも応用できます。

「この狂気じみた3命令のシーケンス(定数ロードを除く)は、符号付き32ビット全範囲で正確です。」
  1. walrus01

    少し関連した話題ですが、私は最近、個人生活やビジネス生活で1つのカレンダーだけを気にすればいいということがどれほど簡単なことかを考えていました(西洋のグレゴリオ暦です)。歴史的にペルシャ語圏の多くの地域で、教育を受けた技術的・専門的な生活を送る、少しでも信心深いイスラム教徒であれば、3つのカレンダーを管理しなければなりません:

    1) 西洋のグレゴリオ暦(外国人とのビジネス、海外旅行、銀行、金融、インターネット上で行うほとんどすべてのことなど)。

    2) イスラムのアラビア起源の太陰暦(ラマダンがいつ始まるか、ハッジに行くのに適した時期はいつか、イード・アル=フィトルはいつか、イード・アル=アドハーはいつかなど)。これは西洋のグレゴリオ暦に対して1年あたり10〜11日「後ろ向き」に進むため、10年ごとにラマダンが真夏または真冬になることがあります。

    3) ノウルーズのような新年の行事のためのペルシャの太陽暦:https://en.wikipedia.org/wiki/Nowruz 、そして一般的にペルシャ関連の文化的な事柄:https://en.wikipedia.org/wiki/Solar_Hijri_calendar

    でも待って、まだあります!たとえば、あなたがウズベキスタンやタジキスタン、またはその地域に住んでいて、ロシア人とビジネスをしているとします。ロシア人が休暇中で企業が閉まっている時期を考えなければならないかもしれません。なぜなら、彼らは東方正教会の暦に基づいて祝日や宗教的行事を行っているからです。基本的に、英国の標準的な「バンクホリデー」に英国でビジネスをしようとするのと同じ問題です。彼らのクリスマスは私たちのクリスマスと同じではありません[…]

  2. dfdsvfdvd

    もし day = "friday" なら output = :)

    そうでなければ output = :(

  3. rmunn

    素晴らしい記事で、プログラミングにとても役立ちます。頭の中で曜日を計算するには、別の(そして非常に便利な)トリックがあります。それは、日番号ではなく、グレゴリオ暦の月と日を使うものです。というのも、99%の場合はそれが求めているものだからです:「2026年8月31日は何曜日になるか?」

    そのトリックは、どんな年でも、うるう年でなくても、次の日付はどの年でも同じ曜日になるということに気づくことです:4/4、6/6、8/8、10/10、12/12。(アメリカで好まれる月/日の形式を使うか、世界の他の地域が使う日/月の形式を使うかにかかわらず、どちらの場合もこれらの日付は同じであり、それは便利です)。これらの日付が何曜日になるかは年によって異なります:今年(2026年)はすべて土曜日、昨年はすべて金曜日、来年はすべて日曜日になります。しかし、どの年でも、これらの日付は63日間隔で、7の倍数なので、常に同じ曜日になります。

    そしてそれだけではありません:5/9、9/5、7/11、11/7を見てください — これらも同じ曜日です!(繰り返しますが、アメリカのカレンダー形式でも世界の他の地域の形式でも、これは便利に機能します)。これらの奇数日付は、「9時から5時までの仕事、7-11」という記憶フレーズで簡単に覚えられます。そして、ほら、12か月のうち9か月の「特別な」日を覚えました。(1月、2月、3月については後で説明します)。

    ここで一旦止めて、これがなぜ役立つかを説明します。多くの皆さんはすでに[…]

  4. srean

    太陽の年周運動の周期、月の満ち欠けの周期、そして日の単位が、互いに素でなければいいのに。

    もし共鳴していればいいのに。

  5. userbinator

    これがパフォーマンスクリティカルな計算であるようなアプリケーションをすぐには思いつかないので、サイズを最適化したくなりますが、より一般的な「7で割った余りをすばやく求める方法」という意味では、これははるかに実用的な用途になります。

この日のほかの記事

2026-08-20