隠し部屋の秘境

豆知識的な小ネタ見つけては投稿していきます

余り演算の性質

目次へ余り演算とは次のようなもの
a%b=aをbで割った余り
数学ではこの演算子よりも合同式を使われがちですが、コンピューター分野ではバリバリこっちです。
ただ、この%演算は処理しづらく、一度に複数組み込むと式が汚くなってしまいます。(処理すると可読性は下がります。注釈しましょう)
しかし、調べてみると便利な性質を持つようなのでまとめました。

結論から言うと次のような性質があります。
(名前は勝手につけました。ご指摘があればコメントよりお願い致しますm(_ _)m)

目次

  1. 基本則 a=[a/b]×b+a%b
  2. 周期性 (a+kb)%b=a%b
  3. 和の冪等性 (a+b)%c={(a%c)+b}%c
  4. 積の冪等性 (a×b)%c={(a%c)×b}%c
  5. 指数の冪等性 (a^b)%c={(a%c)^b}%c
  6. 分配法則 c(a%b)=ac%bc
  7. 商の余り [a/b]%c=(a%bc-a%b)/b
  8. 省略定理 (a%b)%c=a%b (b≦c)
  9. 短絡定理 (a%b)%c=a%c (bはcの倍数)
  10. 減法定理 (a-b)%a=(a-1)-(b-1)%a (1≦b

番外

今回は証明構造がユニークなので良い頭の体操になります。良ければ皆さんも考えてみてくださいね!

それでは解説を始めます

a=[a/b]×b+a%b

まずは基礎です。前提の伝え合わせも兼ねておきます。
[x] : xを超えない最大の整数
→ここでは0≦xを想定して「切り捨て」の演算子として用いています

その上で、この式は
商×割る数 + 余り = 割られる数
を意味している事がわかると思います。
要は小学校の算数ですね。

当たり前っぽいですが一応基本方針の提示として証明しておきます。

これは普通に青チャートとかにも載ってるので安心して使って大丈夫です。

(a+kb)%b=a%b

kbはbの倍数を意味しています。
要するに割る数の倍数を足しても余りは変わらないことを表現しています。

詐欺的に%演算が出てきたと感じるかもしれません。
日本語に訳せば解決します。
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]%c=(a%bc-a%b)/b

正直どう役に立つのか検討もつかないですが、証明するだけしてみましょうか。

さしずめこれもなんかの証明に使うんでしょうね。
ポイント
[a/b]%cの%演算を何とかしたかったので、無から%演算を生成するを逆に辿ることで処理出来るのではないかと考えました。

(a%b)%c=a%b (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つになります。解決できる保証はありませんが楽しみにしててください