通分して足したら約分が発生する「分数の足し算」を量産する
はじめに
こちらのブログ記事に触発されまして、僕も考えてみることにしました。
今の僕の生活スタイルにおいては、小学生の方に分数の足し算を教える機会がままありますので、気になったのです。
目標設定
この記事の目標は
「足し算した結果、約分が発生するような分数の足し算問題を量産する」
ということにします。
例えばこういうものですね。
2つの既約分数を、分母を最小公倍数に揃えることで通分し、分子を足した結果、最後に約分が発生するようなものです。
必要条件を調べていく
まず、求める「問題」を
とします。は全て正の整数で、
と
は互いに素、
と
は互いに素とします。
以下、と
が互いに素であることを
と表すことにします。
と
の最大公約数を
として、
とします。
必然的にです。
と
の最小公倍数は
となります。
すると、先ほどの問題を通分して足し算した結果は次のようになります。
ここで、 が素数
で約分できると仮定します。
まず、分母について、
もしがpで割り切れるなら、約分できるためには
がpで割り切れなければなりませんが、
と矛盾します。よって
は
で割り切れない。
についても同様に
で割り切れない。
よっては
の倍数です。
つまり
より、
は
で割り切れない。
同様にも
で割り切れない。
次に、分子について、
約分できるということはこれがの倍数なので、
手順
ということで、以上の議論から、次のようにすれば、条件を満たす問題が量産できそうです。
1.
素数を決めて
2.
の倍数でない
を
と
を満たすように決めて
3.
の倍数
を
を満たすように決めて
4.
を出題する
はい。
ただ、難しそうなのが2.ですね。
の倍数でない
を
を満たすように
ここまでなら大したことはないです。例えば、別々の素数を割り当てて4つ全部互いに素にすればいいです。実際の条件はもっと弱いですが。
これが問題ですね。
改良
ということで、ここからは、これを満たすの決め方を見ていきます。
以下、合同式はすべてとします。
を変形して
なので、
を満たす
が存在します。
それを両辺にかけて
の計算は、「拡張ユークリッド互除法」を使って計算することができます。できるようです。
ということで、を決めれば、
を
で割った余りが決まります。
あとはそれに、を満たすまで
を
ずつ増やしていけば、欲しい組み合わせが見つかります。
手順(改)
ということで、改めて手順をまとめるとこうです。
1.
素数を決めて
2_1.
の倍数でない
を
を満たすように決めて
2_2.
と
を満たす
を決めて
3.
の倍数
を
を満たすように決めて
4.
を出題する
ということになります。
感想考察など
単にいくつかの素数を選んだら一つの「問題」がポンと出るようにできるともっと嬉しいですが、できるのか…?
なお、この手順で「約分が発生する分数の足し算」が全て生成可能かどうか(十分条件かどうか)はちゃんと検証しておりません。
全て生成可能な気はしています。多分必要十分条件になっているはず…。
必要条件ではあるはずだ(条件に当てはまらないものは生成されない)。
また、これが必要十分条件になっているとして、先程の
分数の足し算で「約分」が発生する条件(2) - tsujimotterのノートブック
に書かれている必要十分条件とどんな関係にあるのかは、僕のp進数についての理解が浅いためよくわかりませんでした。
僕の用いたあたりと、リンク先の記事にある
あたりになにか関係がありそう。
ソースコードに落とし込んで実際に量産してみる
せっかくなので、今回の手法を使って「通分して足したら約分が発生する分数の足し算」を量産してみました。
https://dartpad.dev/bf5a7225bf5995e69cfe500a1af6968b
僕が最近普段使っているDartという聞き慣れない言語を使ってしまいましたが、何をやっているかは見て取れると思います。
コメントもつけていますし、変数名はこの記事と揃えてあります。
リンク先は実行環境とセットなので、コードを書き換えて色々実験することも可能です。
ただし、記事内の手法で生成可能な全てのパターンは網羅していませんのでご注意ください。
は素数しか入れてないし、
は最初に見つかった奴しか使ってないし、
に限定してます。