岡竜之介のブログ

岡竜之介のブログです。

通分して足したら約分が発生する「分数の足し算」を量産する

はじめに

こちらのブログ記事に触発されまして、僕も考えてみることにしました。

今の僕の生活スタイルにおいては、小学生の方に分数の足し算を教える機会がままありますので、気になったのです。

分数の足し算で「約分」が発生する条件 - tsujimotterのノートブック

分数の足し算で「約分」が発生する条件(2) - tsujimotterのノートブック

目標設定

この記事の目標は

「足し算した結果、約分が発生するような分数の足し算問題を量産する」

ということにします。

例えばこういうものですね。

\displaystyle{ \frac{1}{10} + \frac{7}{6} = \frac{3}{30} + \frac{35}{30} = \frac{38}{30} = \frac{19}{15}}

2つの既約分数を、分母を最小公倍数に揃えることで通分し、分子を足した結果、最後に約分が発生するようなものです。

必要条件を調べていく

まず、求める「問題」を

 \displaystyle{\frac{a}{b} + \frac{c}{d} }

とします。 a,b,c,dは全て正の整数で、abは互いに素、cdは互いに素とします。

以下、abが互いに素であることを a \perp bと表すことにします。

bdの最大公約数をgとして、

b = gB

 d = gD

とします。

必然的に B \perp D, \, \, a \perp B, \, \, c \perp D, \, \,  a \perp g, \,\,c \perp gです。

bdの最小公倍数はgBDとなります。

すると、先ほどの問題を通分して足し算した結果は次のようになります。


 \displaystyle{\frac{a}{b} + \frac{c}{d}   = \frac{a}{gB} + \frac{c}{gD} = \frac{aD+Bc}{gBD} }


ここで、  \displaystyle {\frac{aD+Bc}{gBD} }素数 pで約分できると仮定します。

まず、分母gBDについて、

もし Bがpで割り切れるなら、約分できるためには aDがpで割り切れなければなりませんが、 B \perp D, \, \, a \perp Bと矛盾します。よってBpで割り切れない。

Dについても同様にpで割り切れない。

よってgpの倍数です。

 a \perp bつまり a \perp gBより、apで割り切れない。

同様にcpで割り切れない。



次に、分子 aD+Bcについて、

約分できるということはこれがpの倍数なので、

 aD+Bc \equiv 0 \pmod{p}

手順

ということで、以上の議論から、次のようにすれば、条件を満たす問題が量産できそうです。



1.
素数pを決めて


2.
pの倍数でない a,D,B,c
 B \perp D, \, \, a \perp B, \, \, c \perp D
 aD+Bc \equiv 0 \pmod{p}を満たすように決めて


3.
pの倍数g a \perp g, \,\,c \perp gを満たすように決めて


4.
  \frac{a}{gB} + \frac{c}{gD} を出題する



はい。


ただ、難しそうなのが2.ですね。

pの倍数でない a,D,B,c
 B \perp D, \, \, a \perp B, \, \, c \perp Dを満たすように

ここまでなら大したことはないです。例えば、別々の素数を割り当てて4つ全部互いに素にすればいいです。実際の条件はもっと弱いですが。

 aD+Bc \equiv 0 \pmod{p}

これが問題ですね。

改良

ということで、ここからは、これを満たす a,D,B,cの決め方を見ていきます。



以下、合同式はすべて \pmod{p}とします。


 aD+Bc \equiv 0を変形して

 aD \equiv -Bc



 D \perp pなので、DD^{-1} \equiv 1を満たす D^{-1}が存在します。

それを両辺にかけて


 a \equiv -D^{-1}Bc


 D^{-1}の計算は、「拡張ユークリッド互除法」を使って計算することができます。できるようです。

モジュラ逆数 - Wikipedia


ということで、 D,B,cを決めれば、apで割った余りが決まります。



あとはそれに、 a \perp Bを満たすまでapずつ増やしていけば、欲しい組み合わせが見つかります。

手順(改)


ということで、改めて手順をまとめるとこうです。



1.
素数pを決めて


2_1.
pの倍数でない D,B,c
 B \perp D, \, \, c \perp Dを満たすように決めて


2_2.
 a \equiv -D^{-1}Bc \pmod{p} a \perp Bを満たすaを決めて


3.
pの倍数g a \perp g, \,\,c \perp gを満たすように決めて


4.
  \frac{a}{gB} + \frac{c}{gD} を出題する


ということになります。

感想考察など


単にいくつかの素数を選んだら一つの「問題」がポンと出るようにできるともっと嬉しいですが、できるのか…?


なお、この手順で「約分が発生する分数の足し算」が全て生成可能かどうか(十分条件かどうか)はちゃんと検証しておりません。

全て生成可能な気はしています。多分必要十分条件になっているはず…。

必要条件ではあるはずだ(条件に当てはまらないものは生成されない)。




また、これが必要十分条件になっているとして、先程の

分数の足し算で「約分」が発生する条件(2) - tsujimotterのノートブック

に書かれている必要十分条件とどんな関係にあるのかは、僕のp進数についての理解が浅いためよくわかりませんでした。

僕の用いたa,c,B,Dあたりと、リンク先の記事にあるk,lあたりになにか関係がありそう。


ソースコードに落とし込んで実際に量産してみる


せっかくなので、今回の手法を使って「通分して足したら約分が発生する分数の足し算」を量産してみました。

https://dartpad.dev/bf5a7225bf5995e69cfe500a1af6968b


僕が最近普段使っているDartという聞き慣れない言語を使ってしまいましたが、何をやっているかは見て取れると思います。

コメントもつけていますし、変数名はこの記事と揃えてあります。

リンク先は実行環境とセットなので、コードを書き換えて色々実験することも可能です。

ただし、記事内の手法で生成可能な全てのパターンは網羅していませんのでご注意ください。

B,D,c素数しか入れてないし、aは最初に見つかった奴しか使ってないし、g=pに限定してます。