https://projecteuler.net/problem=627
131着。
久しぶりの自作。問題を思いついてから1年で日の目を。
この問題を解くのに苦労したのは、Polynomialのライブラリを作ることでした。しかし、SymPyを使えば簡単。ここでSymPyの使い方を紹介しておきます。
変数
import sympy from sympy.abc import x, y, z f = x+y*z print f
こうすると、x, y, zが多項式の変数とみなされ、
x + y*z
と出力されます。簡単ですね。
ただし、これは1文字の変数のみで、2文字以上なら、
x1 = sympy.Symbol("x1")
これでx1が変数とみなされます。
展開
多項式は何もしないと展開されません。
f = (x+1)*(y+1) print f
とすると、
(x + 1)*(y + 1)
と出力されます。
f.expand()
とすると、はじめて展開されます。
x*y + x + y + 1
代入
f = (x+1)*(y+1)+(y+3)*(y+4) f.replace(y, x)
yがxに置換されて次のように出力されます。
(x + 1)**2 + (x + 3)*(x + 4)
値も代入できます。
f.replace(y, 1)
一度に代入したい場合は、次のようにdictを使います。
f = x+y+z f.subs({y: x**2, z: x**3})
x**3 + x**2 + x
和
f(x, 1) + f(x, 2) + f(x, 3) + f(x, 4) + f(x, 5)
を次のように簡潔に書けます。
f = (x+1)*(y+1) sympy.Sum(f, (y, 1, 5)).doit()
20*x + 20