Numpyを使った多項式の累乗計算について
以前した質問((バイナリ法を用いた)多項式の累乗計算について)の続きの質問です。
1変数の多項式の累乗計算をしていたのですが、
ある次数以下の結果のみ知りたかったので、
次のようなコードを書きました。
# -*- coding: cp932 -*-
import numpy
# m次以下のみにする
def mth_degree_poly(p, m):
return numpy.poly1d(list(p)[- m - 1:])
def power(f, n, m):
p = numpy.poly1d(numpy.array([1], dtype = numpy.int64))
for i in format (n, 'b'):
p *= p
p = mth_degree_poly(p, m)
if i == '1':
p *= f
p = mth_degree_poly(p, m)
return p
f0 = numpy.poly1d(numpy.array([4, 3, 2, 1], dtype = numpy.int64))
print list(reversed((power(f0, 15, 45)).c))
print list(reversed((power(f0, 15, 4)).c))
出力結果
[1, 30, 465, 4960, 40845, 276066, 1590085, 8003580, 35839245, 144672190, 5318000
61, 1794232440, 5591221545, 16174660530, 43617158385, 110012216516, 260248759395
, 578739992010, 1212052994915, 2394073568880, 4465009918551, 7869335811350, 1311
3723590175, 20668736021700, 30811909487775, 43435666238874, 57874992919695, 7283
2798011960, 86477359352115, 96744251753430, 101799552129259, 100538923462140, 92
949580044720, 80183958662080, 64289991816960, 47677224152064, 32507254108160, 20
224232570880, 11370846289920, 5704957296640, 2510929526784, 946423726080, 294691
799040, 71470940160, 12079595520, 1073741824]
[1, 30, 465, 4960, 40845]
上記において、
「多項式のかけ算を行なった後でm次以下のみにする」
ということを行なっていますが、
この無駄を解消する方法はあるのでしょうか?
(ただし、数学的解決法を用いない方法でお願いします。)