mm411-- source --
-- Matrix Multiplication by PDC, Mou 1991 Algo.4.11
-- Consider A as a side-by-side of two submatrices, B as a stack of two.
-- then C = [ A0 B0 + A1 B1 ] (1x1 blocks)
--
-- Definitions:
--
N = 4
-- split vert, split horiz, associate all combinations, choose the useful
d = sel(1,0,0,1) @ outer @ (d_lr(1), d_lr (0))
-- sum correspondents
h_mm = [+]
-- stop at vectors, make an outer product matrix to add
baseq = AND @ (iscol,isrow)
mm411 = PDC(d,id,id,h_mm,baseq,outerProduct)
--
-- Application
--
A = randMat(N,N,fourth_roots(),seed=42)
B = randMat(N,N,fourth_roots(),seed=43)
trace(mm411, A, B)
-- end source --
-- trace: mm411([[ 1, 1, -1, 1.0j] [[ 1, -1, 1.0j, -1.0j]
[ 1.0j, 1.0j, 1, 1] [ -1, 1, -1.0j, -1.0j]
[-1.0j, 1, 1, 1] [ 1, -1.0j, -1, -1.0j]
[ 1.0j, 1.0j, 1, 1.0j]] [-1.0j, 1.0j, 1, 1]]) --
mm411([[ 1, 1, -1, 1.0j] [[ 1, -1, 1.0j, -1.0j]
[ 1.0j, 1.0j, 1, 1] [ -1, 1, -1.0j, -1.0j]
[-1.0j, 1, 1, 1] [ 1, -1.0j, -1, -1.0j]
[ 1.0j, 1.0j, 1, 1.0j]] [-1.0j, 1.0j, 1, 1]])
divide d -> (
( [[ 1, 1] [[ 1, -1, 1.0j, -1.0j]
[ 1.0j, 1.0j] [-1, 1, -1.0j, -1.0j]]
[-1.0j, 1]
[ 1.0j, 1.0j]] ),
( [[-1, 1.0j] [[ 1, -1.0j, -1, -1.0j]
[ 1, 1] [-1.0j, 1.0j, 1, 1]]
[ 1, 1]
[ 1, 1.0j]] )
)
mm411([[ 1, 1] [[ 1, -1, 1.0j, -1.0j]
[ 1.0j, 1.0j] [-1, 1, -1.0j, -1.0j]]
[-1.0j, 1]
[ 1.0j, 1.0j]] )
divide d -> (
( [[ 1] [[1, -1, 1.0j, -1.0j]]
[ 1.0j]
[-1.0j]
[ 1.0j]] ),
( [[ 1] [[-1, 1, -1.0j, -1.0j]]
[1.0j]
[ 1]
[1.0j]] )
)
mm411([[ 1] [[1, -1, 1.0j, -1.0j]]
[ 1.0j]
[-1.0j]
[ 1.0j]] )
⇣ atom; basef -> [[ 1, -1, 1.0j, -1.0j]
[ 1.0j, -1.0j, -1.0, 1.0]
[-1.0j, 1.0j, 1.0, -1.0]
[ 1.0j, -1.0j, -1.0, 1.0]]
mm411([[ 1] [[-1, 1, -1.0j, -1.0j]]
[1.0j]
[ 1]
[1.0j]] )
⇣ atom; basef -> [[ -1, 1, -1.0j, -1.0j]
[-1.0j, 1.0j, 1.0, 1.0]
[ -1, 1, -1.0j, -1.0j]
[-1.0j, 1.0j, 1.0, 1.0]]
post [+] -> [[ 0, 0, 0.0, -2.0j]
[ 0.0, 0.0, 0.0, 2.0]
[-1.0-1.0j, 1.0+1.0j, 1.0-1.0j, -1.0-1.0j]
[ 0.0, 0.0, 0.0, 2.0]]
combine id_ -> [[ 0, 0, 0.0, -2.0j]
[ 0.0, 0.0, 0.0, 2.0]
[-1.0-1.0j, 1.0+1.0j, 1.0-1.0j, -1.0-1.0j]
[ 0.0, 0.0, 0.0, 2.0]]
mm411([[-1, 1.0j] [[ 1, -1.0j, -1, -1.0j]
[ 1, 1] [-1.0j, 1.0j, 1, 1]]
[ 1, 1]
[ 1, 1.0j]] )
divide d -> (
( [[-1] [[1, -1.0j, -1, -1.0j]]
[ 1]
[ 1]
[ 1]] ),
( [[1.0j] [[-1.0j, 1.0j, 1, 1]]
[ 1]
[ 1]
[1.0j]] )
)
mm411([[-1] [[1, -1.0j, -1, -1.0j]]
[ 1]
[ 1]
[ 1]] )
⇣ atom; basef -> [[-1, 1.0j, 1, 1.0j]
[ 1, -1.0j, -1, -1.0j]
[ 1, -1.0j, -1, -1.0j]
[ 1, -1.0j, -1, -1.0j]]
mm411([[1.0j] [[-1.0j, 1.0j, 1, 1]]
[ 1]
[ 1]
[1.0j]] )
⇣ atom; basef -> [[ 1.0, -1.0, 1.0j, 1.0j]
[-1.0j, 1.0j, 1, 1]
[-1.0j, 1.0j, 1, 1]
[ 1.0, -1.0, 1.0j, 1.0j]]
post [+] -> [[ 0.0, -1.0+1.0j, 1.0+1.0j, 2.0j]
[1.0-1.0j, 0.0, 0, 1.0-1.0j]
[1.0-1.0j, 0.0, 0, 1.0-1.0j]
[ 2.0, -1.0-1.0j, -1.0+1.0j, 0.0]]
combine id_ -> [[ 0.0, -1.0+1.0j, 1.0+1.0j, 2.0j]
[1.0-1.0j, 0.0, 0, 1.0-1.0j]
[1.0-1.0j, 0.0, 0, 1.0-1.0j]
[ 2.0, -1.0-1.0j, -1.0+1.0j, 0.0]]
post [+] -> [[ 0.0, -1.0+1.0j, 1.0+1.0j, 0.0]
[1.0-1.0j, 0.0, 0.0, 3.0-1.0j]
[ -2.0j, 1.0+1.0j, 1.0-1.0j, -2.0j]
[ 2.0, -1.0-1.0j, -1.0+1.0j, 2.0]]
combine id_ -> [[ 0.0, -1.0+1.0j, 1.0+1.0j, 0.0]
[1.0-1.0j, 0.0, 0.0, 3.0-1.0j]
[ -2.0j, 1.0+1.0j, 1.0-1.0j, -2.0j]
[ 2.0, -1.0-1.0j, -1.0+1.0j, 2.0]]
-- result: [[ 0.0, -1.0+1.0j, 1.0+1.0j, 0.0]
[1.0-1.0j, 0.0, 0.0, 3.0-1.0j]
[ -2.0j, 1.0+1.0j, 1.0-1.0j, -2.0j]
[ 2.0, -1.0-1.0j, -1.0+1.0j, 2.0]]
--
|