Project Euler 627

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