• 乘法


    机子32bit i3-2120 2GiB 老爷机. 不会汇编.

    naive 2

    naive比较慢,略

    Karatsuba 1.585

    对于固定长度的Karatsuba来说,由于它有几个bit的空间开销,能储存的量不如int64,略.

    Toom-3 1.463

    机器限制,只能用五个i64 mult拼成一个i84 mult -> i168.

    设原先两个数是(A=a_2 n^2 + a_1 n + a_0)(B=b_2 n^2+b_1 n+b_0).((0le a_2...b_0 < n))

    (f_a(n)=a_2 n^2 + a_1 n + a_0),我们称这个操作为一次量词插值.

    (f(n)=f_a(n)f_b(n)).

    (显然,此时我们可以把一个数(a)看成一个多项式(f_a),结果为多项式(f_w),次数为相乘的两个数的多项式的次数之和,那么乘法就几乎是它们的卷积).

    考虑如何卷积.

    我们可以对5个点插值:

    [egin{align*}f(0)&= &a_0b_0 \ f(1)&= &(a_2+a_1+a_0)(b_2+b_1+b_0) \ f(-1)&= &(a_2-a_1+a_0)(b_2-b_1+b_0) \ f(2)&= &(4a_2+2a_1+a_0)(4b_2+2b_1+b_0) \ f(infty)&= &a_2b_2end{align*} ]

    对于w,这个插值类似这样:

    [egin{align*} && && && && w_0&=f(0) \ w_4& +& w_3& +& w_2& +& w_1& +& w_0&=f(1) \ w_4& -& w_3& +& w_2& -& w_1& +& w_0&=f(-1) \ 16w_4& +& 8w_3& +& 4w_2& +& 2w_1& +& w_0&=f(2) \ w_4&&&&&&&&&=f(infty) end{align*} ]

    我们可以把这个方程解出来,那么:

    [egin{align}w_0&=f(0)\ w_4&=f(4)\ w_2&=frac{f(1)+f(2)}{2}-(w_0+w_4)\ w_3&=frac{f(2)+3f(0)-3f(1)+f(-1)-12f(infty)}{6}\ w_1&=f(1)-w_0-w_2-w_3-w_4end{align} ]

    这里使用了5次乘法,一次除三(O(n)),好多次加减法(O(n)),总复杂度(T(n)=5T(n/3)+O(n)=n^{log_3{5}}approx n^{1.463})

  • 相关阅读:
    1070 结绳
    1069 微博转发抽奖
    1068 万绿丛中一点红
    1067 试密码
    1066 图像过滤
    1065 单身狗
    CSS--文本溢出与换行
    css--滤镜filter
    css--flex布局
    css--table布局
  • 原文地址:https://www.cnblogs.com/tmzbot/p/4830517.html
Copyright © 2020-2023  润新知