Python中多项式乘法的朴素递归算法

时间:2018-09-16 00:39:30

标签: python recursion polynomial-math polynomials

我正在尝试实现用于多项式乘法的分而治之算法。这是讲义中给出的伪代码: enter image description here

其中A, B是每个多项式的系数列表,n是问题的大小(-1级),a_l, b_l是感兴趣系数的索引。

这是我尝试使用Python3实施的方法:

def poly_mult_dc_naive(A, B, n, a, b):
  n = int(n)
  a = int(a)
  b = int(b)
  C = [None] * int(2*n - 1)

  if n == 1:
    C[0] = A[a] * B[b]
    return C[0]

  C[0:n-1] = poly_mult_dc_naive(A, B, n//2, a, b)
  C[n:2*n-1] = poly_mult_dc_naive(A, B, n//2, a + (n // 2), b + (n // 2))

  W = poly_mult_dc_naive(A, B, n/2, a, b + (n // 2))
  V = poly_mult_dc_naive(A, B, n/2, a + n/2, b)
  C[n // 2:n + (n // 2) - 1] += W + V
  return C

但是我得到奇怪的结果。例如,让A = [1,2,3,4] B = [4,3,2,1]我得到:

[4, None, 8, 3, 6, 12, None, 16, 9, 12, 2, None, 4, 1, 2, None, 8, 3, 4, None, None]

正确答案是[4, 11, 20, 30, 20, 11, 4]

有人可以指出我哪里出了问题以及如何解决吗?

2 个答案:

答案 0 :(得分:1)

快速更新:我认为我已经使用C的numpy数组(而不是列表)调试了我的代码。这是更新的版本:

import numpy as np

def poly_mult_dc_naive(A, B, n: int, a: int, b: int):
  C = np.zeros(2*n - 1, dtype=int) # here I changed it from list to np array
  if n == 1:
    C[0] = A[a] * B[b]
    return C[0]
  C[0:n-1] = poly_mult_dc_naive(A, B, n//2, a, b)
  C[n:2*n-1] = poly_mult_dc_naive(A, B, n//2, a + (n // 2), b + (n // 2))
  W = poly_mult_dc_naive(A, B, n//2, a, b + (n // 2))
  V = poly_mult_dc_naive(A, B, n/2, a + (n//2), b)
  C[(n // 2) : (3*n // 2) - 1] += W + V
  return C

奖金问题:有人知道我可以将参数n,a和b保留为int类型的更好方法吗?

我只是想写:

n = int(n)
a = int(a)
b = int(b)

可能不是最优雅的方式。

答案 1 :(得分:0)

  • 没有必要将n,a,b从float强制转换为int。只需在各处(即W,V行中)使用// 2整数除法。这样会将int保持为int。
  • C[n // 2:n + (n // 2) - 1]行非常需要括号,它很容易误读。我会写C[(n//2) : (3*n//2)-1]
  • 但我强烈建议您使用numpy向量,而不要使用Python列表。向量的加法,乘法等。