自作のFloraの公式で年月日から曜日を計算する方法

このQ&Aのポイント
  • Floraの公式を使用して、年月日から曜日を計算する方法を紹介します。
  • Floraの公式は、Y年M月D日の曜日を返す式であり、独自の計算方法を用いています。
  • 詳しい証明や式の解説は、ブログ『心善淵』の関連記事で確認できます。
回答を見る
  • ベストアンサー

曜日計算 公式 Floraの公式

年月日を代入したら曜日を返す公式を自作しました。 もちろん、ツェラーの公式があるのは知っていたのですが。 誰か数学に詳しい方、私が自作した公式「Floraの公式」を、評価していただけたらなと思い、投稿させていただきました。 ブログを持っており、リンク先には証明および関連記事があります。 詳しい方からのアドバイスを待っております。 <証明> Floraの公式はY年M月D日の曜日を返す式である。 Floraの公式  Flr(Y,M,D) = R + [R/4] - [Y/100] + [Y/400] + [2.6*M + 2.7] + D - 1 (R = Y%28) 結果は以下のように定義する。  Flr(Y,M,D)%7 = 0: Sun., = 1: Mon., .= 2: Tue., = 3: Wed., = 4:Thu., = 5: Fri., = 6: Sat.   (ただし、M = 1,2はそれぞれM = 13,14としY = Y - 1とする。)   (RはYを28で割った余りである。R = Y%28) 式の証明は大きく以下のように分けられる(1,2月は、前年の13,14月とする。)。 A、同一世紀内での規則性を式にあらわす式を証明する。 B、世紀をまたがった規則性をあらわす式を証明する。 C、月毎の変化をあらわす式を証明する。 D、まとめ ただし、以下の点に注意。 ※0は日曜日、1は月曜日、2は火曜日、・・・である。 ※1年は3月から始まり、次の年の2月で終わることとし、1月を13月、2月を14月とする)、と考える。 ※20世紀は、1900~1999年のような間をさす。他の世紀も同様に。 以下の詳しい証明は、ブログに書いております。ブログ『心善淵』の関連記事:http://blog.goo.ne.jp/hihumizzz/c/3efe00080b47e4d6e59aac992ebb8891

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

どう見ても、ツェラーの公式としか思えないんですが、 これが独立した解であるといえるのでしょうか。 たんなるツェラーの公式の変形ですよね。

hihumizzz
質問者

お礼

コメントありがとうございます。 他の方のコメントも参考にすると、ツェラーの公式と同じとのことです。 確かに、そのようです。私の勉強不足でした。

その他の回答 (6)

回答No.7

ぼくが知っているツェラーの公式はこれです。 W=(Y+[Y/4]-[Y/100]+[Y/400]+[26*(M+1)/10]+D-1)%7 (Mは3~14、日曜日が0) R+[R/4]-[Y/100]+[Y/400]+[2.6*M + 2.7]+D-1 のうち、  R=Y%28は、後で%7するのでY%28%7=Y%7からRをYにしても答えは同じ。  [2.6*M+2.7]は、M=3~14で[2.6*M+2.6]と同じ。(=[26*(M+1)/10]) ということは、ツェラーの式と全く同じ式になりますので、Floraの式で正しい値が計算できるでしょう。 ちなみに、ツェラーの式はいろいろなバリエーションがあるようで、 よく見かける式はこう変形します。 W=(Y+[Y/4]-[Y/100]+[Y/400]+[26*(M+1)/10]+D-1)%7 Y=100*C+N として、年のところだけ計算  Y+[Y/4]-[Y/100]+[Y/400]  =(100*C+N)+[25*C+N/4]-C+[C/4]  =124*C+N+[N/4]+[C/4]  ※25*Cは整数なので[]の外に出した  =(18*7-2)*C+N+[N/4]+[C/4] 18*7は後で%7をするので消してもおなじ  → -2*C+N+[N/4]+[C/4] W=(D+[26*(M+1)/10]+N+[N/4]+[C/4]-2*C-1)%7 他に変形版として、[26*(M+1)/10]-1 = [2.6*M+1.6] = [(13*M+8)/5]もありますね。

hihumizzz
質問者

お礼

丁寧な解説、ありがとうございます。 ツェラーの公式に、このようなパターンがあるとは知らなかったです。 私の数学の知識も中途半端なもののため、このようなことに気が付かなかったようです。 なぜ28という数字が出てきたかというと、7と4の最小公倍数という点からです。詳しくはブログの証明をみていただけたら幸いです。 私が高校~大学一年のころに作った公式です。やっとすっきりしました。ありがとうございました。

  • Barsoom
  • ベストアンサー率60% (3/5)
回答No.6

No.5の誤字を訂正します。 少数部 ⇒ 小数部 失礼しました。

hihumizzz
質問者

お礼

丁寧な解説、ありがとうございます。 私の数学の知識も中途半端なもののため、このようなことに気が付かなかったようです。 なぜ28という数字が出てきたかというと、曜日の数の7とうるう年の周期の4の最小公倍数という点からです。詳しくはブログの証明をみていただけたら幸いです。 私が高校受験~大学一年のころに作った公式です。やっとすっきりしました。結局、別の道をたどっても、行きつく結論は同じということでしょうか。 ありがとうございました。勉強不足だったなと感じております。

  • Barsoom
  • ベストアンサー率60% (3/5)
回答No.5

R は Y のままでも結果が同じなので,あえてひと手間かけて,あらかじめ R を求めるのは意味がないですね。 [2.6*M+2.7] の2.7の少数部は,0.6以上0.8未満で計算が成り立ちます。 したがって,この2.7を2.6とすると,ツェラーの公式の [26(M+1)/10] と同じです。 自力で公式を導かれた頭脳には敬服しますが,No.4の方の回答と同じ評価にならざるを得ません。

回答No.3

すいませんタイプミスです。 =(1901%28)+[(1901%28)/4]-[1901/100]+[1901/400]+[2.6*11+2.7]+1-1

回答No.2

No.1さんは計算が違ってますね。。 1901年11月1日の場合・・・ Flr(1901,11,1) =(1901%28)+[(1901%28)/4]-[1900/100]+[19900/400]+[2.6*11+2.7]+1-1 =25+6+19+4+31+1-1 =47 47%7=5 (金曜日) [2.6*M+2.7]の部分は、[2.6*M+2.6]でも同じなので、[26*(M+1)/10]とも書けます。ツェラーの公式はこれを使ってますね。 公式が合っているかどうかは検証してません。。すいません

hihumizzz
質問者

お礼

コメントありがとうございました。 上記にて計算は正しいです。実際に金曜でした。エクセルのweekday関数で確認しました。 他の方のコメントを参考にすると、結局はツェラーの公式と同じ内容とのことです。ちょっとがっかりですが、勉強になりました。私は勉強不足だったなと感じております。 このようなつまらない投稿にコメントしていただきありがとうございました。

  • at9_am
  • ベストアンサー率40% (1540/3760)
回答No.1

えーと、 >  Flr(Y,M,D) = R + [R/4] - [Y/100] + [Y/400] + [2.6*M + 2.7] + D - 1 (R = Y%28) Y, M, D=(1900, 10,1) で試す(1901年11月1日)と、 Flr(1900,8,1) = R + [R/4] - [Y/100] + [Y/400] + [2.6*M + 2.7] + D - 1 (R = Y%28) = mod(1900, 28)+mod(1900/4, 28) - (Y/100) + 28.7 = 9.7 となって、整数にすらなりません。 したがって、おかしいですね。

関連するQ&A

  • C言語 ツェラーの公式を使った曜日の計算

    ツェラーの公式を使い、年、月、日にちから曜日を表示するプログラムを作りました。 #include<stdio.h> main() { int y,m,d,x,z; printf("年、月、日にちの順に入力してください→"); scanf("%d%d%d",&y,&m,&d); if(m<2){ m=m+12; y=y-1; } x=y+y/4-y/100+y/400+(13*m+8)/5+d; z=x%7; switch(z){ case 0: printf("日曜日\n"); break; case 1: printf("月曜日\n"); break; case 2: printf("火曜日\n"); break; case 3: printf("水曜日\n"); break; case 4: printf("木曜日\n"); break; case 5: printf("金曜日\n"); break; case 6: printf("土曜日\n"); break; } } これを基本に、1582年10月5日以前の入力があったとき「エラー」と表示するにはどうすればいいですか? 解答お願いします。

  • F-BASIC ツェラーの公式 年月を入力してカレンダー表示

    F-BASICの下記の問題がどうしても分からなくて困っています。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ツェラーの公式を使い、年と月を入力すればその月のカレンダーを以下の例のように表示するプログラムを作成せよ。ただし、ツェラーの公式は次のように与えられる。西暦年、月、曜日を y%,m%,d% とすると (y%+y%\4-y%\100+y%\400+(13*m%+8)\5+d%)MOD 7 ただし、m%<=2 のときは上の式で y%=y%-1,m%=m%+12 とおく。 この結果、0なら日曜、1なら月曜・・・、6なら土曜となる。 例 2003年6月 1 日 2 月 3 火 4 水 5 木 ・ ・ ・ ・ 28 土 29 日 30 月 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 一週間悩んだのですが、分かりませんでした。 どうかよろしくお願いいたします。

  • 日付と曜日から、1週間前(7日前)の日付を算出するプログラム

    ツェラーの公式を用いて、日付(年月日)から曜日を算出する方法があります。 例えばY年M月D日の曜日は、下式で求められます。 (Y + Y/4 - Y/100 + Y/400 + (13*M + 8)/5 + D) % 7 *但し、1月・2月は、前年の13月・14月とする。 *答えは0=日曜~6=土曜 これを応用して(別に応用しなくても良いんですが・・・)日付と曜日から、1週間前の同一曜日の日付を求めるプログラムを考えております。 例) 入力:2005年9月21日、水曜日 出力(解):2005年9月14日 この例は非常に簡単に求められますが、完全汎用型のプログラムを考えております。 しかし、なかなか良い知恵が出ません!! どなたかご教示頂けると助かります。 よろしくお願いします。

  • c# ツェラーの公式を利用した計算方法

    利用言語はc# ソフトはvisual studio2022を利用しています。 年・月・日をそれぞれ入力し、ツェラーの公式を利用して曜日を出したいのですがやり方が分からず困っています。 分かる方がいらっしゃいましたらお力を貸していただけましたら幸いです。 曜日の判定をする部分は以下で実現したいです。 Console.WriteLine("{0}曜日", g[dayofweek]);

  • 比重の公式の証明ができません。

    比重の公式の証明ができません。 現在比重について学んでます。 ゲーリュサック型の比重瓶を使用して蒸留水と溶液の重量を測定し、次の公式に当てはめれば溶液の比重が測定できると書いてあります。 比重=(溶液の質量/蒸留水の質量)÷d ※d=測定温度の蒸留水の比重 しかし、何故この式を使用すると比重が求められるかが分からないのです。 蒸留水の重さ(y):蒸留水の比重(d)=溶液の重さ(x):溶液の比重(a) 上記の関係性が成り立つ時、内項外項の積によって ya=xd が成り立ち、移項によって出来る式は a=xd/y → a=(x/y)×d ではないのかと行き詰ってしまうのです。 何故、公式では÷dになるのでしょうか? もしかしたら数学的な基本が出来ておらず、とんでもない解釈をしてたらすみません。 その点も含めて教えてください。お願いします。

  • 縦カレンダーの曜日に色づけ

    <?php $lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy)); for ($i = 1; $i <= $lastd; $i++) ?> <tr> <?php  $ts = mktime(0, 0, 0, $mm, $i, $yyyy);  $ymd = date("Y/m/d", $ts);  $ymdstr = strftime("%Y年%m月%d日(%a)", $ts); ?> <td><?php echo $ymd ?></td> <?php //曜日表示  $_m =$m;  $dd = $i;  $aday = array("日", "月", "火", "水", "木", "金", "土"); while( $m==$_m ){ printf("<td><center>%s</center></td>", $aday[date("w", $ts)]); $d++; //次の日の月を$_mに代入 $_m = date("m",$ts); } ?> 日付の部分を"switch文"を使って書きたいのですが、わからずに苦労しています。教えてもらえると助かります。よろしくお願いします。

    • ベストアンサー
    • PHP
  • Excelで曜日表示の改行

    1つのセルに日付と曜日を表示させたいのですが、 日付の下に曜日を表示させるには どうすれば良いですか? 例)  11月20日   (水) 今は、 ユーザー定義  ↓ [種類]欄に 「m"月"d"日("aaa")"」 と設定してるので、一列に 11月20日(水) と表示されていしまいます。 よろしくお願いします。

  • 円の断面二次モーメントの算出方法について

    円の断面二次モーメントの算出方法について 私なりに計算した方法を以下に示します。 x^2+y^2=r^2の円に原点よりy離れた場所に単位面積ΔA((2×√r^2-y^2)×dy)に応力σが作用している時 のモーメントM(x)=2×y×(√r^2-y^2)×σとなり、y=r×sinθ、σ=y・E/Rとすると(E:ヤング率、R:半径曲線)、 M(x)=2×E/R×r^4×sin^2θ×cos^2θとなります。 円全体のモーメントM=∫(-1/2π~1/2π)(2×E/R×r^4×sin^2θ×cos^2θ)dθ (sin^2θ×cos^2θ=1/4sin2θ) これは不定積分の公式より(sin^2θ=(x/2)-(1/4)sin 2x) 与式=π×E/R×r^4=π/32d×r^4×E/R (r=1/2d) となってしまいました。 公式ではπ/64d×r^4となります。 大変恐縮ですが、計算、考え方等間違いがありましたが、ご教授下さい。 どうかよろしくお願いします。

  • date関数で、曜日を日本語表示でループさせる。

    いつもお世話になります。 さて、date関数で、曜日を日本語表示でループさせ、日曜日だけ外す方法で悩んでおります。 今日から、順番に日付を表示させるのは、下記でできたのですが、 <?PHP $nday = mktime(); for($i=0;$i<5;$i++){ print "<option>".date("m月d日 (D)", mktime(0,0,0,date("m"),date("d")+$i,date("y")))."<br />"; } ?> 例) 04月18日 (Wed) 04月19日 (Thu) 04月20日 (Fri) 04月21日 (Sat) 04月22日 (Sun) 日本語表示にさせようとすると、曜日がループしません。 <?PHP $nday = mktime(); $youbi = array("日","月","火","水","木","金","土"); for($i=0;$i<5;$i++){ print "<option>".date("m月d日 (".$youbi[date(w)].")", mktime(0,0,0,date("m"),date("d")+$i,date("y")))."<br />"; } ?> 例) 04月18日 (水) 04月19日 (水) 04月20日 (水) 04月21日 (水) 04月22日 (水) また、ここから日曜日だけ外すことはできますか? お手数ですが、ご教示ください。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 重積分の計算

    以下の重積分の問題の計算の仕方がわかりません。 答えは与えられておりますので、途中式を教えていただきたいです。 【問題】 (1)∬D x/y^2 dxdy  D:2≦x≦4, 1≦y≦x^2     (2)∬D r^2sinθ drdθ D:0≦θ≦π, 0≦r≦1+cosθ 【解答】 (1)6-log2  (2)4/3 よろしくお願いします。