Sympyでディオファントス方程式を解く

Python function sumof3squares(n) [on hold] – StackOverflow

こういう小ネタが有り難い.

f = Eq(i**2 + j**2 + k**2, n)
f

 

i^{2} + j^{2} + k^{2} = n

 

任意のnに対して,i, j, kの解が存在するかという問題.
(nが与えられた時,条件(i, j, k >=1)を満たすi, j, kが存在するか否か(True/False))

 

これは,

不定方程式を解く

と同じ.
 

numpyでの解法はもう同じ事を何度も繰り返しているので,Sympyで考えてみたい.
 
 

まず,質問で提示されている
 

n=6(i, j, k = 1, 1, 2)

n=29(i, j, k = 2, 3, 4)

について考える.
 

f.subs(n, 6)

 

i^{2} + j^{2} + k^{2} = 6

 
 

solve(f.subs(n, 6), [i, j, k])

 

\left [ \left \{ i : - \sqrt{- j^{2} - k^{2} + 6}\right \}, \quad \left \{ i : \sqrt{- j^{2} - k^{2} + 6}\right \}\right ]

 
 

不定方程式はsolve()では解けないので,ディオファントス方程式を解くモジュールを使う.
 

from sympy.solvers.diophantine import diophantine

diophantine(f.subs(n, 6))

{(1,1,2)}

同様に,

diophantine(f.subs(n, 29))

{(0,2,5),(2,3,4)}

 

質問では

“if n = i² + j² + k² for integers i,j,k such that i ≥ 1, j ≥ 1 and k ≥ 1.”

らしいので,(2,3,4)の組み合わせだけが得られる.

 
 

True or Falseが欲しいだけなので,
 

def sumof3squares(n_value):
    for i, j, k in diophantine(f.subs(n, n_value)):
        if i >= 1 and j >= 1 and k >= 1:
            return True
    return False


sumof3squares(6), sumof3squares(29), sumof3squares(16), sumof3squares(20)

(True, True, False, False)

広告
カテゴリー: 未分類 パーマリンク

Sympyでディオファントス方程式を解く への1件のフィードバック

  1. ピンバック: 粉末@それは風のように (日記)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中