目次へ余り演算とは次のようなもの
a%b=aをbで割った余り
数学ではこの演算子よりも合同式を使われがちですが、コンピューター分野ではバリバリこっちです。
ただ、この%演算は処理しづらく、一度に複数組み込むと式が汚くなってしまいます。(処理すると可読性は下がります。注釈しましょう)
しかし、調べてみると便利な性質を持つようなのでまとめました。
結論から言うと次のような性質があります。
(名前は勝手につけました。ご指摘があればコメントよりお願い致しますm(_ _)m)
それでは解説を始めます
① a=[a/b]×b+a%b
まずは基礎です。前提の伝え合わせも兼ねておきます。
[x] : xを超えない最大の整数
→ここでは0≦xを想定して「切り捨て」の演算子として用いています
その上で、この式は
商×割る数 + 余り = 割られる数
を意味している事がわかると思います。
要は小学校の算数ですね。
当たり前っぽいですが一応基本方針の提示として証明しておきます。
商をQ, 余りをRとします。
この定義からは直接a÷b = Q…R が言えます。
すると(a-R)÷b = Q が言えます。
a-R = bQ ∴ a = bQ+R が言えました!
a÷b = Q…R ⇒ a = bQ+R です。
ここの式の変換が後の証明でも基本になってきます。
また、ここでは後はQ = [a/b] を示せば良いのですが、もう1つ重要なのが0≦余り<割る数です。
続き
これより、となります。
ここで、
Qは整数より小数部分は0
は0≦R<b ∴ 0≦R/b<1 より小数部分は
よってa/bの小数部分はR/bとなるので、
a/bの切り捨ての値はa/b-R/b = Q
よって[a/b]=Q が言えました。
また、a%b=R は定義なので自明です。
以上をまとめると、
a = Qb+R
Q, Rに代入する
a = [a/b]×b + a%b [完]
今回は小数部分という考え方を用いましたが、商を吟味する場合にはこれも重要になってきます。ただ、余りに関する演算なため、商の議論は重要にならない事が殆どで滅多に必要ありません。
あと、これを逆に辿ると
続き
a=b[a/b]+a%b
∴ (a-a%b)/b=[a/b] ∴ (a-a%b)÷b=[a/b]…0
ここで、a%b=a-b[a/b]=b(a/b-[a/b]),
0≦a/b-[a/b]<1 より
0≦b(a/b-[a/b])<b ∴ 0≦a%b<b が言えるので
a%bはbで割り切れないことが分かります。
a = (a-a%b) + a%b であり、a-a%bはbで割り切れるのでa%bだけ余ります。
以上よりa÷b=[a/b]…a%b
∴ a÷b=Q…R が言えました。[完]
これでa÷b = Q…R ⇐ a = bQ+R も言えたので
a÷b = Q…R ⇔ a = bQ+Rとなります。ちょっと無理矢理感がありますが。
② (a+kb)%b=a%b
kbはbの倍数を意味しています。
要するに割る数の倍数を足しても余りは変わらないことを表現しています。
商をQ, 余りをRとします。
a÷b = Q…R ⇔ a = bQ+R
∴ a+kb = bQ+R + kb = b(Q+k) + R
∴ a+kb = b(Q+k) + R ⇔ (a+kb)÷b = (Q+k)…R
よってa%b = (a+kb)%b = R [完]
詐欺的に%演算が出てきたと感じるかもしれません。
日本語に訳せば解決します。
aをbで割った余り、a+bcをbで割った余り、どちらもRになったということです。ここの対応が定着すれば大した事じゃないです。
ポイント
kbをQとまとめる発想と、それをまとめて商と見なせるかが鍵になってきます。代数学的なセンスが問われる所だと思います。
③ (a+b)%c={(a%c)+b}%c
先に和の要素の余りを計算しても最終的な余りは変わらないことを表現しています。
ポイント
とりあえず律儀に、(a+b)÷c, a÷c, b÷c それぞれの商と余りを定義したところから始めたとしても、
a=cQa+Raなどをa+bに揃えた時点でおのずと答えが出たことと思います。
恐らくこれは殆どの人が解けたのではないでしょうか。
④ (a×b)%c={(a%c)×b}%c
先に積の要素の余りを計算しても最終的な余りは変わらないことを表現しています。
これも殆どの人は出来たんじゃないだろうか?ポイント
掛け算が足し算のかき集めである事を連想出来れば③が使えそうだと気づけます。
⑤ (a^b)%c={(a%c)^b}%c
数学の合同式でよく知られるやつです。合同式では、aの代わりは同位相であればなんでも良かったので若干意味が異なります。
しかしまあ、②をぶち込んでやればそちらも再現可能です
③の証明と全く同じ形ですね
⑥ k(a%b)=ka%kb
まさかの分配法則持ち演算子です。交換法則も結合法則もありません。分配法則だけです。
ポイント
実は出来心でa = bQ+Rの両辺にkをかけてたまたま発見しました。証明しようと思ってすると案外難しいのかもしれない。
⓪ [[a/b]/c]=[a/bc]
a,b,cは任意の自然数です。切り捨てを纏められる事を言っています。
%演算が不在ですが証明では便利なので挙げました。番号が⓪なのはもはや%演算の性質じゃないからです。
aをbで割った余りをRbとします。
[a/b]をcで割った余りをRcとします。
①とa%b=Rbより a = b[a/b]+Rb
∴ a/bc = [a/b]/c + Rb/bc
= [[a/b]/c] + Rc/c + Rb/bc
ここで、
0≦Rb<b
∴ Rb/bc < 1/c
∴ Rc/c + Rb/bc < Rc/c + 1/c = (Rc+1)/c
またRcは整数でありRc
よって
[a/bc] = [[[a/b]/c] + Rc/c + Rb/bc]
= [[a/b]/c] [完]
ポイント
これ以外に思いついきませんでした。まじでエグいです。もっとスマートな証明考え中です。
⑦ [a/b]%c=(a%bc-a%b)/b
正直どう役に立つのか検討もつかないですが、証明するだけしてみましょうか。
ポイント
[a/b]%cの%演算を何とかしたかったので、無から%演算を生成する①を逆に辿ることで処理出来るのではないかと考えました。
⑧ (a%b)%c=a%b (b≦c)
ある数で余りを計算した後、それ以上の数で割っても余りは変わらないことを言っています。
意味的には当たり前ですね。証明してみましょう。
bで割った余りをRbとします。
それをcで割った商と余りを
それぞれQc,Rcとします。
Rb÷c = Qc…Rc ⇔ Rb = cQc+Rc
ここで背理法を用います。
1≦Qcとすると、
b≦c
c≦cQc ∵ 1≦Qc, 0<c
cQc=cQc+0≦cQc+Rc ∵ 0≦Rc
cQc+Rc=Rb
これらをまとめると、
b≦c≦cQc=cQc+0≦cQc+Rc=Rbとなり、
b≦Rbが導かれますが、
これは0≦Rb<bに見事に矛盾する事が分かります。
よって1≦QcではないのでQc<1となるのですが、Qcは0以上の整数なのでこれは0です。
よって
Rb=cQc+Rc ∴ Rb=c×0+Rc ∴ Rb=Rc
∴ a%b=(a%b)%c [完]
①もそうでしたけど、当たり前な事を証明するのって難しいんですね。
ポイント
Rbをそれより大きなcで割る時点で商が出ない,すなわちQc=0となるのは予想できたので、それを証明するためにQc=0以外の場合では何かしら不都合が生じるはずだと予想できました。背理法まっしぐらです。
⑨ (a%b)%c=a%c (bはcの倍数)
倍数なら上書き出来るという事です。(説明雑)
aをbで割った商をQb, cで割った商をQcとすればQb = Qc%k となって奥が深いです。
ポイント
b=kcと表現するのはいいとして、商を定義して生真面目に商の形を求めようとすると⓪を含めとんでもない記述量になったので割愛しました。②を使うことで商を考えずに済んだのが大きいです。完璧主義だとこれに気づけないかも知れません。
⑩ (c-b)%c=(c-1)-(b-1)%c (1≦b<c)
割られる数に割る数が含まれている場合も、この条件下では分離する事ができます。
ポイント
意識した点は2つです。
1つ目は、%演算の中にマイナスを残したくなかったので、マイナスが着いているbを主人公にした事です。
2つ目は、最初はb=cQ+Rで定義していたのですが余りの範囲が0≦c-R<c-1となったため、その調整としてb-1=cQ+Rで定義し直したところから書き始めています。調整の対象がbなのはcでは上手くいかないからです。
// QUEST_/
現在苦戦している未解決問題がこちら
1. a%(b+c)のbとcを分離せよ!
2. (a%b)%cを一般化せよ!
3. [[a/b]/c]=[a/bc]を簡潔に示せ!
4. 実数へ拡張せよ!
以上4つになります。解決できる保証はありませんが楽しみにしててください