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