わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

曜日のたし算

いきなりですが問題です.

  • 金曜日の3日後は月曜日
  • 金曜日の3日前は火曜日

これらを,剰余演算子 % を用いた数式で表しなさい.

さっそくですが,解答例です.剰余演算子 % のオペランドは整数ですので,それぞれの曜日に,整数値を割り当てることから始めます.
どの曜日を0にしても,いいと言えばいいのですが,日曜日を0にするのが,自然でしょうか.
すると,他の曜日の割り当てが決まります.月曜日は1,火曜日は2,…,そして土曜日は6です.表にすると,以下のようになります.

次に,数式で表していきます.算数教育の知見によると,式にはイコールなどを含む「センテンス型」と,含まない「フレーズ型」があるとのことですが,2個の例が「ナニナニはコレコレ」となっているので,センテンス型を選ぶことにします.イコールについては,%がC言語由来なのに合わせて,==を採用します.
金曜日から始まる文に限定する必要はありませんので,「xのp日後の曜日はy」と一般化しておきます.xとyが,曜日に対応する整数です.pはさしあたり,正の整数に限定します.
すると,「xのp日後の曜日はy」に対応する式は,(x + p) % 7 == yと書くことができます.
「金曜日の3日後は月曜日」に割り当てるなら,x = 5, p = 3, y = 1のとき,その式を評価すればよいのです.(5 + 3) % 7 == 1という式について,==の左は8%7で1,右はもちろん1,なので式全体は真となります.
pを負にする前に,p==0の場合を,片づけておきます.「xの0日後はy」は,曜日に直すと「日曜日は日曜日」「月曜日は月曜日」…「土曜日は土曜日」を言っているわけです.0から6までの整数の範囲をとる変数x,yについて,(x + 0) % 7 == yが成立するのは,x==yのときのみですから,大丈夫です.
次に,pが負の場合に対応する式は,(x + p) % 7 == yでよいか,考えていきます.
「金曜日の3日前は火曜日」*1は,どうでしょうか.このとき,x = 5, p = -3, y = 2です.(5 + -3) % 7 == 2という式について,==の左も右も2ですので,式全体は真となります.
とはいえ,これでは不都合の出てくる状況があります.具体的には,%の左オペランドが負となるような場合です.「月曜日の3日前は金曜日」で考えます.x = 1, p = -3, y = 5を,(x + p) % 7 == yに当てはめると,==の左は-2%7となり,C言語の多くの処理系でこれは-2と評価されます.==の右は5ですので,-2==5は偽となる式です.
そこで等式の修正を試みます.pが1週間前まで(p>=-7)だったら,(x + p + 7) % 7 == yとすれば,「月曜日の3日前は金曜日」(x = 1, p = -3, y = 5)もOKになります.ですがここは,「10日前」でも「1000日前」でも,対応できるようにしたいところです.
オーバーフローしない範囲の任意の整数で,成立するような式は,((x + p) % 7 + 7) % 7 == yです.
確かめましょう.まず,「月曜日の3日前は金曜日」(x = 1, p = -3, y = 5)を当てはめると,==の左は((1 + -3) % 7 + 7) % 7 → (-2 % 7 + 7) % 7 → (-2 + 7) % 7 → 5 % 7 → 5です.右はyの値そのものですので5ですので,式全体も真です.
1000日前はというと…月曜日の1000日前は,何曜日でしょうか.x = 1, p = -1000を,((x + p) % 7 + 7) % 7に当てはめてみると,この式の評価結果は2となります.なので「月曜日の1000日前は火曜日」です.検算しておくと,1001は7で割り切れますので,「月曜日の1001日前は月曜日」です.「1000日前」は,「1001日前」の1日あとですので,月曜日の1日あとは火曜日ということで,間違ってなさそうです.


この問題は,5月16日の授業からです.RSAで剰余演算が重要な役割を持っているので,日常生活を題材に,数式で表してみようという意図です.なお,『新版暗号技術入門 秘密の国のアリス』では,時計の「時」を使用しています.「12時」を「0時」に読み替える点には注意しつつも,曜日設定のような任意性はなく,取扱いが容易になっていると感じました.
答案を見ていると,曜日を数に割り当てるところで,いくつか間違いがありました.日曜日を7とした,以下の表にしているのです.

任意の整数Xに対して,X % 7は,7になりません.割り切れるときは0です
ただ,この表のように割り当てた場合でも,((x + p) % 7 + 7) % 7 == yではなく((x + p) % 7 + 7) % 7 == y % 7とすれば,真偽判定の式としてはOKになります.残念ながら,そのような答案はありませんでした.==の左右に「%7」をつけるのは冗長で,そうなるとCから脱却して,x + p ≡ y (mod 7)と書きたいところです.


昔書いたこと:

*1:「xのq日前の曜日はy」は,「xの-q日後の曜日はy」と表せます.なお,p<0のときの「xのp日後の曜日はy」は,「xのabs(p)日前の曜日はy」と表すことになります.