一元不定方程式
著者:梅谷 武
語句:一元不定方程式
一元不定方程式について述べる。
作成:2006-05-21
更新:2013-06-17
 第2章において整係数の二元一次不定方程式の解法について考えましたが、有理数体上の代数方程式において整数解を求めるときに、この方程式を不定方程式といいます。一般には二元以上の不定方程式を解くことは難しい問題ですが、一元不定方程式は有限回の代入計算を実行することで解くことができます。

命題3.7.2 整係数一元不定方程式

 整係数の一元n次不定方程式
anXn + ⋯ + a2X2 + a1X + a0 = 0, n ≧ 1, a0 ≠ 0
の整数解αa0の約数である。

証明

αを整数解とする。anαn + ⋯ + a2α2 + a1α + a0 = 0より、
a0 = - α ( anαn-1 + ⋯ + a2α + a1 )
となり、α|a0であることがわかる。■
 次に有理係数の一元n次代数方程式
anXn + ⋯ + a2X2 + a1X + a0 = 0, n ≧ 1, a0 ≠ 0
の有理解を求めることについて考えます。まず係数の分母の最小公倍数をかけることによって整係数の代数方程式とすることができます。ですから、最初から整係数と考えても一般性を失うことはありません。両辺にann-1をかけます。
(an X)n + an-1(an X)n-1 + ⋯ + a1 ann-2 (an X) + a0 ann-1 = 0
ここでY=an Xとおけば、整係数の単方程式とすることができます。
Yn + bn-1Yn-1 + ⋯ + b1Y + b0 = 0, n ≧ 1, b0 ≠ 0
整係数の単方程式の有理解については次の補題が成り立ちます。

補題3.7.5

 整係数の一元n次不定方程式
Yn + bn-1Yn-1 + ⋯ + b1Y + b0 = 0, n ≧ 1, b0 ≠ 0
の有理解βb0を割る整数である。

証明

β=
s
t
を有理解とする。ここでs,tは互いに素な整数であるとする。
(
s
t
)n + bn-1(
s
t
)n-1 + ⋯ + b1(
s
t
) + b0 = 0
の両辺にtnをかけるとsn + bn-1 sn-1t + ⋯ + b1 stn-1 + b0 tn = 0となり、これを移行して
sn = - t ( bn-1 sn-1 + ⋯ + b1 stn-2 + b0 tn-1 )
とする。この式からt = ± 1であることがわかる。したがってβは整数であり、 前の命題からβ | b0であることがわかる。■
 ここまで述べたことを整理して、整係数一元代数方程式の有理解を求める算法を与える次の命題が得られます。

命題3.7.8 整係数一元代数方程式の有理解

 整係数の一元n次不定方程式
anXn + ⋯ + a2X2 + a1X + a0 = 0, n ≧ 1, a0 ≠ 0
の有理解βa0 ann-1の約数mによって
β =
m
an
と 表される。
 上の算法による計算例を示します。

例題3.7.10

 整係数一元不定方程式4X3 - 19X2 + 19X + 6 = 0を解け。

sample3.7.4.py

from Poly1 import *
 
f = Poly1( [6,19,-19,4] )
print "f(X) = ", f, "= 0"
m = [ 1, -1, 2, -2, 3, -3, 6, -6 ]
for i in m:
  if f.Horner( i ) == 0:
    print "f(%d) = 0" % i

sample3.7.4.pyの実行結果

f(X) =  4X^3 - 19X^2 + 19X + 6 = 0
f(2) = 0
f(3) = 0

sample3.7.4.rb

require 'mathn'
require './poly1'
 
f = Poly1([6, 19, -19, 4])
print "f(X) = ", f, "= 0", "\n"
m = [1, -1, 2, -2, 3, -3, 6, -6]
for i in m
  if f.Horner(i) == 0
    printf "f(%d) = 0\n", i
  end
end

sample3.7.4.rbの実行結果

f(X) = 4X^3 - 19X^2 + 19X + 6= 0
f(2) = 0
f(3) = 0

例題3.7.15

 整係数一元代数方程式9X2 + 3X - 2 = 0の有理解を求めよ。

sample3.7.5.py

from Poly1 import *
 
f = Poly1( [-2,3,9] )
print "f(X) = ", f, "= 0"
m = [ 1, -1, 2, -2, 3, -3, 6, -6, \
   9, -9, 18, -18 ]
for i in m:
  if f.Horner( Fraction(i,9) ) == 0:
    print "f(%s) = 0" % Fraction(i,9)

sample3.7.5.pyの実行結果

f(X) =  9X^2 + 3X - 2 = 0
f(1/3) = 0
f(-2/3) = 0

sample3.7.5.rb

require 'mathn'
require './poly1'
 
f = Poly1([-2, 3, 9])
print "f(X) = ", f, "= 0", "\n"
m = [1, -1, 2, -2, 3, -3, 6, -6, 9, -9, 18, -18]
for i in m
  if f.Horner(i/9) == 0
    printf "f(%s) = 0\n", i/9
  end
end

sample3.7.5.rbの実行結果

f(X) = 9X^2 + 3X - 2= 0
f(1/3) = 0
f(-2/3) = 0
Published by SANENSYA Co.,Ltd.