问题
给出一个 m × n m\times n m × n 的矩阵 A A A ,以及一个用于计算 u ↦ A u u\mapsto Au u ↦ A u 的(线性的)算法,求一个几乎同样次数乘、同样次加减法的用于计算 v ↦ A T v v\mapsto A^Tv v ↦ A T v 的算法。
本篇 Blog 是个人口嗨。
形式描述
我们有一个函数式 的计算模型:
一个具有 n n n 个输入位和 m m m 个输出位的线性算法 定义如下:
一个自然数 l l l , l l l 条以 i = n + 1 , … , n + l i=n+1,\dots,n+l i = n + 1 , … , n + l 编号的指令:
r i = r j + r k r_i=r_j+r_k r i = r j + r k ,其中 1 ≤ j , k < i 1\leq j,k<i 1 ≤ j , k < i ;
r i = α r j r_i=\alpha r_j r i = α r j ,其中 α \alpha α 是常数,1 ≤ j < i 1\leq j<i 1 ≤ j < i 。
以及一个输出位的映射:f : { 1 , 2 , … , m } → { 1 , 2 , … , n + l } f:\{1,2,\dots,m\}\to\{1,2,\dots,n+l\} f : { 1 , 2 , … , m } → { 1 , 2 , … , n + l } 。
一个算法计算 一个矩阵 P m × n P_{m\times n} P m × n 当且仅当:
对于任意列向量 u = ( u 1 , u 2 , … , u n ) T u=(u_1,u_2,\dots,u_n)^T u = ( u 1 , u 2 , … , u n ) T ,如果定义:
r i = u i r_i=u_i r i = u i ,若 i ≤ n i\leq n i ≤ n ;
按算法中的描述定义 r i r_i r i ,若 i > n i>n i > n 。
则 ∀ i , r f ( i ) = ( P u ) i \forall i, r_{f(i)}=(Pu)_i ∀ i , r f ( i ) = ( P u ) i 。
我们需要做的是:给定一个计算 A A A 的算法,求一个计算 A T A^T A T 的算法,要求两者中的乘法次数相同,加法次数相差 m − n m-n m − n 。我们假定对于 A , A T A,A^T A , A T 都不存在恒为 0 0 0 的输出。
我们也假设算法里没有“无用变量”,即不出现在后面的计算也不作为输出位的变量。
构造
为了方便表示,我们把变量记做不同的英文字母。我们以 I x I_x I x (仅出现在前 n n n 个位置,占位用)表示 x x x 这个变量是输入的;以 O x O_x O x (仅出现在最后,表示输出位映射)。如下是两对例子:
I a ; I b ; c = 2 a ; d = 3 b ; e = c + d ; O e I_a;I_b;c=2a;d=3b;e=c+d;O_e I a ; I b ; c = 2 a ; d = 3 b ; e = c + d ; O e 计算了 ( 2 3 ) \begin{pmatrix}2&3\end{pmatrix} ( 2 3 ) 。对应地,I d ; a = 2 d ; b = 3 d ; O a ; O b I_d;a=2d;b=3d;O_a;O_b I d ; a = 2 d ; b = 3 d ; O a ; O b 计算了 ( 2 3 ) \begin{pmatrix}2\\3\end{pmatrix} ( 2 3 )
I a ; I b ; I c ; d = a + b ; e = c + d ; O e ; O e I_a;I_b;I_c;d=a+b;e=c+d;O_e;O_e I a ; I b ; I c ; d = a + b ; e = c + d ; O e ; O e 计算了 ( 1 1 1 1 1 1 ) \begin{pmatrix}1&1&1\\1&1&1\end{pmatrix} ( 1 1 1 1 1 1 ) 。对应地,I a ; I b ; c = a + b ; O c ; O c ; O c I_a;I_b;c=a+b;O_c;O_c;O_c I a ; I b ; c = a + b ; O c ; O c ; O c 计算了 ( 1 1 1 1 1 1 ) \begin{pmatrix}1&1\\1&1\\1&1\end{pmatrix} ⎝ ⎛ 1 1 1 1 1 1 ⎠ ⎞ 。
那么我们定义一个算法的转置 如下:
将输入变量记为 i 1 , … , i m i_1,\dots,i_m i 1 , … , i m ;
对于原算法中的每个变量 x x x ,定义一个新变量 x ′ x' x ′ 。
在原算法中每有一条指令 y = α x y=\alpha x y = α x ,就将 α y ′ \alpha y' α y ′ 加到 x ′ x' x ′ 上(通过定义临时变量);
在原算法中每有一条指令 y = x + z y=x+z y = x + z ,就将 y y y 加到 x x x 上;
在原算法中每有一条指令 O x O_x O x (实际上并不是“指令”,这里我们意会一下),就把对应位置的 i − i_- i − 加到 x x x 上;
特殊情况:若只存在一条指令用到 x x x :如果是乘法指令 y = α x y=\alpha x y = α x ,那么直接定义 x ′ = α y ′ x'=\alpha y' x ′ = α y ′ ;如果是加法或输出,那么不定义新变量,而是使用相应的变量代替 x ′ x' x ′ 。
新算法中的输出位对应原算法中的输入变量,处理与上述的一般变量相同。
证明
首先我们证明这样定义的转置和原来的乘法、加法次数满足要求:如果原算法中一个变量在 a a a 个指令里被作为加数(y = x + x y=x+x y = x + x 的情况算两遍),b b b 个指令里被作为乘数,c c c 个位置作为输出,那么在转置中,就会出现 b b b 次乘法、以及 a + b + c − 1 a+b+c-1 a + b + c − 1 次加法。所以若原算法中共有 a a a 次加法指令和 b b b 次乘法指令,那么新算法就会有 2 a + b + m − ( a + b + n ) = a + ( m − n ) 2a+b+m-(a+b+n)=a+(m-n) 2 a + b + m − ( a + b + n ) = a + ( m − n ) 次加法,b b b 次乘法。
接下来还要证明新算法正确地计算了 A T A^T A T 。对于原算法一个变量 x x x ,及一个输出位 i i i ,定义 f x , i f_{x,i} f x , i 为 “x x x 对 i i i 的贡献”。严格的说,定义为:若强行将算法中所有在 x x x 之前的所有变量置为 0 0 0 (若 x x x 本身为输入变量,则改为把除 x x x 外的所有输入变量置为 0 0 0 ),而 x x x 置为 1 1 1 ,x x x 后面的变量照常计算,此时算法的第 i i i 个输出位的值。
显然若 t t t 为第 j j j 个输入变量,则 f t , i = P j , i f_{t,i}=P_{j,i} f t , i = P j , i 。
对于一个变量 x x x ,定义 g x , i g_{x,i} g x , i 表示当转置算法的第 i i i 位输入为 1 1 1 而其它为 0 0 0 的时候 x ′ x' x ′ 的值(如果 x x x 是那个“特殊情况”,那么改为代替 x ′ x' x ′ 的变量)。因此不难发现若 t t t 是原算法第 j j j 个输入变量,那么 g t ′ , i g_{t',i} g t ′ , i 就表示新算法计算的矩阵中 i , j i,j i , j 位置的值。因此只需证明 f t , i = g t ′ , i f_{t,i}=g_{t',i} f t , i = g t ′ , i 即可。
而 f t , i = g t ′ , i f_{t,i}=g_{t',i} f t , i = g t ′ , i 其实是显然的:固定 i i i ,对于 t t t 在原算法中的出现位置从后往前进行归纳,容易证明此结论。
因此,定理成立。