
こんにちは。iQeda [@iQeeeda] です。
今回は剰余を使ったグループ分けについて解説します。
なんらかの数字の法則性を発見できると、剰余でなんでもグループ分けが可能です!
グループ分けができると、複雑な数式でもパターンで答えを導けます。
この記事を読めば、プログラミングの余り算の使い時が分かるようになりますよ。
剰余とは

割り算すると必ず「余り」が出ます。 (余り 0 を含む)
これでグループ分けを行うことができます。
余りのことは、専門用語で「剰余」と呼びます。
また、余りだけに注目した割り算を「余り算」と言ったりもします。
奇数と偶数
余り算の代表的なグループ分けに「偶数・奇数」があります。
- 奇数とは
- 2 で割ると余りが 1 になる整数のこと
 
 - 偶数とは
- 2 で割ると余りが 0 になる整数のこと
 
 
これは知っている方も多いかと思います。
周期性と剰余
奇数・偶数以外にも「剰余によるグループ分け」は可能です。
曜日クイズ
100 日後は何曜日?
今日が日曜日の場合、100 日後は何曜日になるでしょうか?
一週間は 7 日で、7 日ごとに同じ曜日がやってきます。
つまり 7 の倍数は「日曜日」になることがわかります。
100 / 7 = 14 余り 2 と計算すると 14 回目の日曜日の 2 日後が 100 日目であり、
「日曜日」の 2 日後は「火曜日」ということが導けます。
1 億日後は何曜日?
今日が日曜日の場合、100000000 日後は何曜日になるでしょうか?
100000000 / 7 = 14285714 余り 2 なので、
これも「火曜日」ということが導けます。注目すべきは剰余の 2 です。
n 日後は何曜日?
つまり n 日後の曜日は n / 7 の剰余から「パターン」で求めることができます。
曜日は 7 を周期として繰り返しているので、こういった計算が可能なのです。
こういった繰り返しの規則性のことを「周期性」と呼びます。
10^100 日後は何曜日?
今日が日曜日の場合、10 の 100 乗日後は何曜日になるでしょうか?
7 の周期性で考える (数の周期性)
10^100 / 7 の計算は少し大変そうです。
まず 7 の周期性を使ってみて、別の周期性もないか探してみましょう。
1 日後… 10 日後… 100 日後… 1000 日後… と、
0 の個数を徐々に増やしたときの曜日を検証してみます。
| 0 の個数 | n 日後 | n / 7 | 曜日 | 
|---|---|---|---|
| 0個 | 1 (10^0) | 1/7 = 0 余り 1 | 月 | 
| 1個 | 10 (10^1) | 10/7 = 1 余り 3 | 水 | 
| 2個 | 100 (10^2) | 100/7 = 14 余り 2 | 火 | 
| 3個 | 1000 (10^3) | 1000/7 = 142 余り 6 | 土 | 
| 4個 | 10000 (10^4) | 10000/7 = 1428 余り 4 | 木 | 
| 5個 | 100000 (10^5) | 100000/7 = 14285 余り 5 | 金 | 
| 6個 | 1000000 (10^6) | 1000000/7 = 142857 余り 1 | 月 | 
| 7個 | 10000000 (10^7) | 10000000/7 = 1428571 余り 3 | 水 | 
| 8個 | 100000000 (10^8) | 100000000/7 = 14285714 余り 2 | 火 | 
| 9個 | 1000000000 (10^9) | 1000000000/7 = 142857142 余り 6 | 土 | 
| 10個 | 10000000000 (10^10) | 10000000000/7 = 1428571428 余り 4 | 木 | 
| 11個 | 100000000000 (10^11) | 100000000000/7 = 14285714285 余り 5 | 金 | 
| 12個 | 1000000000000 (10^12) | 1000000000000/7 = 142857142857 余り 1 | 月 | 
7 の周期性だと n / 7 で「1, 3, 4, 6, 2, 5」という剰余を繰り返すため、
曜日も「月, 水, 火, 土, 木, 金」を繰り返していることが分かります。
つまり 0 の数が 6 増えると、同じ曜日になっています。
このことから 6 の周期性が存在していることが分かります。
6 の周期性で考える (0 の個数の周期性)
ある値を「周期」で割れば、その剰余でグループ分けできることを思い出してください。
0 の個数 / 6 の剰余は「0, 1, 2, 3, 4, 5」のいずれかになります。
剰余に対応する曜日さえ把握していれば、0 が 100 個のときの曜日も分かります。
| 0 の個数 | 0 の個数 / 6 | 曜日 | 
|---|---|---|
| 0個 | 0 / 6 = 0 余り 0 | 月 | 
| 1個 | 1 / 6 = 0 余り 1 | 水 | 
| 2個 | 2 / 6 = 0 余り 2 | 火 | 
| 3個 | 3 / 6 = 0 余り 3 | 土 | 
| 4個 | 4 / 6 = 0 余り 4 | 木 | 
| 5個 | 5 / 6 = 0 余り 5 | 金 | 
| 6個 | 6 / 6 = 1 余り 0 | 月 | 
| 7個 | 7 / 6 = 1 余り 1 | 水 | 
| 8個 | 8 / 6 = 1 余り 2 | 火 | 
| 9個 | 9 / 6 = 1 余り 3 | 土 | 
| 10個 | 10 / 6 = 1 余り 4 | 木 | 
| 11個 | 11 / 6 = 1 余り 5 | 金 | 
| 12個 | 12 / 6 = 1 余り 0 | 月 | 
| … | … | … | 
| 100個 | 100 / 6 = 16 余り 4 | 木 | 
100 / 6 の剰余は 4 なので、剰余が 4 のときに対応する曜日を見ればよいですね。 
10^100 日後の曜日は「木曜日」であることがわかります。
10^100000000 日後は何曜日?
100000000 / 6 = 16666666 余り 4 なので、
10^100000000 日後の曜日も「木曜日」であることがわかります。
このような大きい数を扱うときは周期性を見抜くことが重要です。
そして剰余を使うと「周期性でグループ分け」することが可能です。
0 の個数に注目すると、大きい数の取り扱いがラクになることも分かったと思います。
累乗クイズ
1234567^987654321 の一の位は?
1234567^987654321 は電卓でも計算できません。1234567^1 とか 1234567^2 ですら大きな数字になってしまいます。
ですが、今回は一の位だけ分かればいいことにします。
なので「規則性」さえ見つかれば、もっと単純な話になります。
一の位に影響を与えるのは一の位だけ
1234567^n の計算結果で「一の位に影響を与えるのは、一の位どうしの掛け算 (累乗) 」です。
つまり一の位 7 の累乗だけを追いかけて、その計算結果の一の位に注目しましょう。
| 7^n | 7^n の一の位 | 0 の個数 / 4 | 備考 | 
|---|---|---|---|
7^0 = 1 | 1 | 0 / 4 = 0 余り 0 | ※ 1234567^0 の一の位 | 
7^1 = 7 | 7 | 1 / 4 = 0 余り 1 | ※ 1234567^1 の一の位 | 
7^2 = 49 | 9 | 2 / 4 = 0 余り 2 | ※ 1234567^2 の一の位 | 
7^3 = 343 | 3 | 3 / 4 = 0 余り 3 | ※ 1234567^3 の一の位 | 
7^4 = 2401 | 1 | 4 / 4 = 1 余り 0 | ※ 1234567^4 の一の位 | 
7^5 = 16807 | 7 | 5 / 4 = 1 余り 1 | ※ 1234567^5 の一の位 | 
7^6 = 117649 | 9 | 6 / 4 = 1 余り 2 | ※ 1234567^6 の一の位 | 
7^7 = 823543 | 3 | 7 / 4 = 1 余り 3 | ※ 1234567^7 の一の位 | 
7^8 = 5764801 | 1 | 8 / 4 = 2 余り 0 | ※ 1234567^8 の一の位 | 
7^9 = 40353607 | 7 | 9 / 4 = 2 余り 1 | ※ 1234567^9 の一の位 | 
一の位は 1, 7, 9, 3 の値を繰り返しているので「周期性」は 4 といえます。
つまり指数 987654321 を 4 で割ったときの剰余を確認すればよいことになります。
987654321 / 4 = 246913580 余り 1 で剰余が 1 なので、
それに対応する一の位は 7 となります。
1234567^987654321 の一の位は 7 になる、が答えです。
「剰余を使って、大きな数の問題を小さな数の問題に落としこむ」基本的な考え方を解説しました。
CS シリーズ
次回
前回
お仕事ください!
僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。 なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。
カテゴリ「CS」の最新記事

    
                  【ロードマップ】文系の元ラーメン屋が学んだコンピュータサイエンス                
                  【データ構造】「木とグラフ・探索アルゴリズム」をわかりやすく解説                
                  【データ構造】キューとスタックの使い方を解説!【実用例たっぷり】                
                  【データ構造】連結リスト・ランナーテクニックを解説!【頻出問題】                
                  【データ構造】面談対策!文字列・配列の問題解説【ハッシュテーブル】                
                  TerraformによるLinodeインスタンス新規作成サンプル                
                  【Fingerprint】CircleCIがSSHできない問題解決                
                  【Laravel】セッションタイムアウト後のログイン処理で前回URLに遷移するバグ修正                
                  M1 Mac(2021)でanyenv/phpenvの初期設定!                
    
    
    
    
    
    
    
    
    
    
    
コメント