今回の内容は、1回目で説明したユークリッドの互除法を使った歯数計算方法と、Excelソルバーを使った方法です。
ユークリッドの互除法を用いる計算例
この例は、chatGPT3.5に、第1回目の例題と同じ問題を解くプログラムを作ってもらいました。依頼内容は次の通りで、完成後の改変はしていません。
「-10x+y=15の整数解を一つ見つけてください」
「それを使って指定の範囲で成立する歯数を列挙してください」
できたプログラムを以下に載せますが、正しい結果を出力してます。
def extended_gcd(a, b): if b == 0: return a, 1, 0 else: d, x, y = extended_gcd(b, a % b) return d, y, x - (a // b) * y def diophantine_solution(a, b, c): gcd, x0, y0 = extended_gcd(a, b) if c % gcd == 0: x = x0 * (c // gcd) y = y0 * (c // gcd) return x, y else: return None def enumerate_diophantine_solutions(a, b, c, start_range, end_range): solutions = [] for x in range(start_range, end_range + 1): y_solution = diophantine_solution(a, b, c - a * x) if y_solution: solutions.append((x, y_solution[1])) return solutions # 方程式 -10x + y = 15 の範囲 [-10, 10] の整数解を求める a, b, c = -10, 1, 15 start_range, end_range = -10, 10 solutions = enumerate_diophantine_solutions(a, b, c, start_range, end_range) if solutions: for solution in solutions: print(f"A solution: x = {solution[0]}, y = {solution[1]}") else: print(f"No solutions in the specified range")
計算結果
Xが-10から10までの範囲で成立するy、つまりZrを出力しています。ピニオン歯数は15なので、サンギヤ歯数はZr-2*Zp=Zr-30として求められます。
A solution: x = -10, y = -85 A solution: x = -9, y = -75 A solution: x = -8, y = -65 A solution: x = -7, y = -55 A solution: x = -6, y = -45 A solution: x = -5, y = -35 A solution: x = -4, y = -25 A solution: x = -3, y = -15 A solution: x = -2, y = -5 A solution: x = -1, y = 5 A solution: x = 0, y = 15 A solution: x = 1, y = 25 A solution: x = 2, y = 35 A solution: x = 3, y = 45 A solution: x = 4, y = 55 A solution: x = 5, y = 65 A solution: x = 6, y = 75 A solution: x = 7, y = 85 A solution: x = 8, y = 95 A solution: x = 9, y = 105 A solution: x = 10, y = 115
chatGPTとの応答
Q「-10x+y=15の整数解を一つ見つけてください」
A「10x+y=15 の一つの解を見つけるために、ユークリッド互除法や他の整数解法を使用することができます。一般的に、不定方程式の整数解を見つける手順は以下の通りです。
不定方程式を ax+by=c の形に変換します。この場合、-10+y=15 なので、a=-10,b=1,c=15 です。
拡張ユークリッド互除法を使用して、gcd(−10,1) の整数解を求めます。
求めた整数解をもとに、一般解を導きます。
具体的にこの方程式に適用すると:
拡張ユークリッド互助法を使用して、gcd(−10,1) の整数解を求めます。これにより、gcd(−10,1)=1 かつ整数解(x0,y0)が得られます。
一般解は次のようになります。ここでkは整数です。
x=x0+b/gcd(a,b)k
y=y0-a/gcd(a,b)k 」
Q「このプログラムで、整数解を1組だけでなく、指定した範囲の解を列挙するようにしてほしい」
A「了解しました。以下は、指定された範囲内の ax+by=c の整数解を全て列挙するプログラムの例です。整数解を見つけると、その都度、解が出力されます。」
Excelソルバーを使った例
次の例はユークリッドの互除法ではなく、Excelのソルバーを使います。なので、VBAを使うこともなく、表計算だけで処理が終了します。以下がその画面です。
これは、生成AIとは無関係の自作処理ツールです。
動作原理
n,Zpは与えられたとして、不定方程式「-nX+2Zr=2Zp」を満足するXとZrを1組見つけるために、「Excelソルバー」に解かせます。具体的には、式を変形して
として、左辺値を「0」にする最適化問題に置き換えます。
するとExcelソルバーは、目標値を満足する解の組み合わせを提示してくるので、それを使って芋づる式に他の解を求めていきます。
結果
問題なく動作しました。しかし、ソルバーの設定や起動が面倒で、とくにわざわざ採用する理由もないので、中身の説明はしないでおきます。
最後に
今回はchatGPT、前回はCopilot(Being chat)を使って、一発でちゃんと動くプログラムを作ってくれましたが、レアなケースだと思います。google Bardにも尋ねたのですがユークリッドの互除法使ったプログラムを提示してきたのはいいとして、間違った解でした。違っていることを指摘しても「このように、177=0 は、厳密には成立しませんが、方程式の解を理解するためには、ある意味、成立していると考えることができます。」などと理解困難なことを言うのであきらめました。いろいろあって面白いのですが。