|
3.4.9 領域上の等式と不等式
Mathematicaは通常,方程式の変数は任意の複素数を表すことができると仮定する.しかしReduceを使うときは変数がもっと限定された領域内のオブジェクトを表すことを明示的にMathematicaに伝えることができる.

領域内で解く
Reduceはデフォルトでxが複素数であり得ると仮定し,5つの複素解すべてを与える.
In[1]:= Reduce[x^6 - x^4 - 4x^2 + 4 == 0, x]
Out[1]= 
しかしここではxが実数であると仮定して実数解のみを返す.
In[2]:= Reduce[x^6 - x^4 - 4x^2 + 4 == 0, x, Reals]
Out[2]= 
ここではxが整数であると仮定して整数解のみを返す.
In[3]:= Reduce[x^6 - x^4 - 4x^2 + 4 == 0, x, Integers]
Out[3]= 
1変数の単一の多項式は常に有限個の離散解を持つ.そのような場合はReduce[eqns, vars, dom]が領域dom内にある解を選択することで解のフィルタの働きをしていると考えることができる.
しかし変数が増えると,値が他の変数に依存する変数が存在することがあるパラメトリックな曲線や曲面に方程式の解が対応し,途端に話ははるかに複雑になる可能性がある.このような依存関係はしばしば方程式あるいは不等式の集合で表現される.しかし,その形式はある領域から別の領域に移動すると甚だしく変化することがある.
これは複素数の解を簡単な式で与える.
In[4]:= Reduce[x^2 + y^2 == 1, {x, y}]
Out[4]= 
実数の解を表すためには不等式を導入する必要がある.
In[5]:= Reduce[x^2 + y^2 == 1, {x, y}, Reals]
Out[5]= 
整数の場合,解は離散点の方程式として表される.
In[6]:= Reduce[x^2 + y^2 == 1, {x, y}, Integers]
Out[6]= 
入力に含まれるのが等式のみであれば,Reduceはデフォルトによってすべての変数が複素数であると仮定する.しかし入力に不等式が含まれている場合は,不等式は実数のみしか比較できないのでReduceは含まれる代数的変数はどれも実数であると仮定する.
変数は不等式の中にあるので実数であると仮定される.
In[7]:= Reduce[{x + y + z == 1, x^2 + y^2 + z^2 < 1}, {x, y, z}]
Out[7]= 

整方程式と不等式の解のためのブロック構築の概略
実領域と複素領域上の多項式の系の場合,解は常に有限個の要素からなり,その要素内で代数あるいは関数によって変数の値が与えられる.
ここでは要素がxについての方程式あるいは不等式によって区別されている.
In[8]:= Reduce[x y^3 + y == 1, {x, y}, Complexes]
Out[8]= 
ここでは要素がxについての不等式で区別されている.
In[9]:= Reduce[x y^3 + y == 1, {x, y}, Reals]
Out[9]= 
原則としてReduceは実変数と複素変数を持った整方程式と不等式のどのような集合についても常に完全な解を求めることができるが,変数の数が増えるにつれて要素の数が指数関数的に増加するため、結果は非常に複雑になることが多い.
変数が3つの場合,解は常に8つの要素を含む.
In[10]:= Reduce[x^2 == y^2 == z^2 == 1, {x, y, z}]
Out[10]= 
SinやExpのような関数を導入した途端に,変数が実変数あるいは複素変数1つの方程式でも解の要素が無限になることがある.Reduceは新たなパラメータを導入してこれらの要素にラベルを付ける.デフォルトでは与えられた解のn番目のパラメータにC[n]という名前が付けられる.一般的には,オプション設定GeneratedParameters -> fを使ってそれがf[n]という名前になるように指定することができる.
ここの要素には整数パラメータ によるラベルが付けられている.
In[11]:= Reduce[Exp[x] == 2, x, GeneratedParameters -> (Subscript[c, #]&)]
Out[11]= 
Reduceは実変数と複素変数を持つ方程式だけでなく整数領域の方程式も扱うことができる.「ディオファントス(Diophantus)方程式」のようなものを解くのは大変難しいことが多い.
実数上でのこの方程式の解を表すのは極めて簡単である.
In[12]:= Reduce[x y == 8, {x, y}, Reals]
Out[12]= 
整数領域での解には8の約数が含まれる.
In[13]:= Reduce[x y == 8, {x, y}, Integers]
Out[13]= 
このような方程式を効果的に解くのには大きな数を因数分解する必要がある.
In[14]:= Reduce[{x y == 7777777, x > y > 0}, {x, y}, Integers]
Out[14]= 
Reduceは整数領域のどのような線形方程式の系も不等式の系も解くことができる. 変数の 個の線形方程式では,一般に 個のパラメータが必要である.しかし不等式の場合ははるかに多くのパラメータが必要なことが多い.
変数は2つしかないが,ここでは3つのパラメータが必要である.
In[15]:= Reduce[{3x - 2y > 1, x > 0, y > 0}, {x, y}, Integers]
Out[15]= 
変数が2つの場合,Reduceは整数についてのいかなる2次方程式も解くことができる.結果はフィボナッチ列に類似しており2次無理数のベキによって表される.
これはPell方程式の解である.
In[16]:= Reduce[{x^2 == 13 y^2 + 1, x > 0, y > 0}, {x, y}, Integers]
Out[16]= 
C[1]は整数である.以下は特定のC[1]の整数値におけるxとyの値である.
In[17]:= FullSimplify[% /. Table[{C[1] -> i}, {i, 4}]]
Out[17]= 
Reduceは整数についての方程式の多くの特定のクラスを扱うことができる.
ここでReduceを使ってThue方程式の解を求める.
In[18]:= Reduce[x^3 - 4 x y^2 + y^3 == 1, {x, y}, Integers]
Out[18]= 
右辺を3にすると式には解がなくなる.
In[19]:= Reduce[x^3 - 4 x y^2 + y^3 == 3, {x, y}, Integers]
Out[19]= 
整数についての方程式はときに全くランダムな解のセットを持つように見えることがある.そして,方程式にほんの少し変更を加えただけで解がひとつもなくなることがある.
実数と複素数についての整方程式の場合,解が存在するかどうかを決定するための確かな「アルゴリズム」が存在する.しかし整数についての整方程式の場合は,ヒルベルト(Hilbert)の第10問題が解けないことから分かるように,そのような一般的な方法は決して存在しない.
特定のクラスの方程式の場合は,そのようなアルゴリズムを見付けるのは可能であり,実際に多くがReduceに実装されている.しかし異なったクラスの方程式を扱うことは数論の全く違った分野と全く違った種類の計算を必要とするように見えることが多い.実際に,いくつかの変数を埋めることにより,他の変数の解が可能なすべてのプログラムの出力に対応するようにできる「普遍的な」整数の整方程式の存在が知られている.ここから,このような方程式には一般的に代数関数のように固定要素によって構築される解で構成される閉じた形は決して存在しないことになる.
Sinのような関数が含まれるようにすると,実数と複素数を含む方程式についても同じ問題が起り得る.
ここのReduceは事実上整数についての方程式を解かなくてはならない.
In[20]:= Reduce[Sin[Pi x]^2 + Sin[Pi y]^2 + (x^2 + y^2 - 25)^2 == 0, {x, y}, Reals]
Out[20]= 

モジュロnの整数を含む方程式の処理
モジュロnの整数方程式の可能な解の数は有限なので,Reduceはシステマティックにその解を求めることができる.
これはモジュロ4のすべての解を求める.
In[21]:= Reduce[x^5 == y^4 + x y + 1, {x, y}, Modulus -> 4]
Out[21]= 

変数の領域を指定する別の方法
これはxは整数であるがyは実数であると仮定する.
In[22]:= Reduce[{x^2 + 2y^2 == 1, x Integers, y Reals}, {x, y}]
Out[22]= 
Reduceは通常複素変数を単一のオブジェクトとして扱う.しかし,解析的ではなかったり分岐切断線をもつ関数を扱う際は,複素変数を実数部分Re[z]と虚数部分Im[z]の2つの部分に分割する必要があることがある.
結果には実数部分と虚数部分が別々に含まれている.
In[23]:= Reduce[Abs[z] == 1, z]
Out[23]= 
ここでもまた虚数部分に独立した条件が付いている.
In[24]:= Reduce[Log[z] == a, {a, z}]
Out[24]= 
Reduceはデフォルトにより不等式に代数的に表れる数は実数であると仮定する.しかしComplexesをデフォルトの領域として明示的にこれを上書きすることもできる.そのような場合は特定の変数がなお実数であると指定することができると便利である.
Reduceはデフォルトによりxが実数であると仮定する.
In[25]:= Reduce[x^2 < 1, x]
Out[25]= 
こうするとReduceはxが複素数である場合を考慮するようになる.
In[26]:= Reduce[x^2 < 1, x, Complexes]
Out[26]= 
xは代数的に表れてはいないので,Reduceはすぐにこれが複素数であると仮定する.
In[27]:= Reduce[Abs[x] < 1, x]
Out[27]= 
ここではxは実数だがyは複素数にもなり得る.
In[28]:= Reduce[{Abs[y] < Abs[x], x Reals}, {x, y}]
Out[28]= 

領域中の特定の解を求める
Reduceは常に連立方程式あるいは連立不等式の解を完全に表すものを返す.しかし,特定の解の例だけを求めたい場合もあるだろう.そのようなときはFindInstanceを使うとよい.
FindInstance[expr, vars, dom]が{}を返した場合は,exprが指定領域にある変数のいかなる値によっても満足されないことをMathematicaが事実上証明したことを意味している.exprが満足される場合は, 3.4.8の不等式についての項で説明してあるように,FindInstanceは一般に極めて恣意的に満足する値を取り出す.
特に整数方程式の場合,たとえReduceが完全な解を求めることができなくても,FindInstanceが方程式の特定の解を求めることができることがしばしばある.そのような場合には方程式の最も小さな解のうちのいずれかが返される.
これは楕円曲線上で最小の整数点を求める.
In[29]:= FindInstance[{x^2 == y^3 + 12, x > 0, y > 0}, {x, y}, Integers]
Out[29]= 
FindInstanceの特徴のひとつに,変数がTrueあるいはFalseという値を持ちうるブーリアン式と一緒にも使える点が挙げられる.式がTrueとなるような変数の真理値が選べるようにFindInstanceを使って特定の式が「満足可能」であるかどうかを検証することができる.
pとqに何を選んでもこの式を満足することはできない.
In[30]:= FindInstance[p && ! (p || ! q), {p, q}, Booleans]
Out[30]= 
こちらは満足することができる.
In[31]:= FindInstance[p && ! (! p || ! q), {p, q}, Booleans]
Out[31]= 
|