fact: Definition Strassen_xI {p : positive} Strassen_p := fun M N => if p <= K then M *m N else let M := castmx (add1pp p, add1pp p) M in let N := castmx (add1pp p, add1pp p) N in let M11 := ulsubmx M in let M12 := ursubmx M in let M21 := dlsubmx M in let M22 := drsubmx M in let N11 := ulsubmx N in let N12 := ursubmx N in let N21 := dlsubmx N in let N22 := drsubmx N in let R11 := (M11 *m N11) + (M12 *m N21) in let R12 := (M11 *m N12) + (M12 *m N22) in let R21 := (M21 *m N11) + (M22 *m N21) in let R22 := (M21 *m N12) + (Strassen_step M22 N22 Strassen_p) in castmx (esym (add1pp p), esym (add1pp p)) (block_mx R11 R12 R21 R22).
imports: ZArith Ncring Ncring_tac mathcomp(ssreflect ssrbool ssrfun eqtype ssrnat seq choice fintype) mathcomp(div finfun bigop prime binomial ssralg finset fingroup finalg) mathcomp(perm zmodp matrix) ssralg_ring_tac