/// <summary> /// Strassen のアルゴリズムで行列の積を求める。 /// </summary> public static ArrayMatrix <StaticModInt <T>, StaticModIntOperator <T> > Strassen <T>( this ArrayMatrix <StaticModInt <T>, StaticModIntOperator <T> > mat1, ArrayMatrix <StaticModInt <T>, StaticModIntOperator <T> > mat2) where T : struct, IStaticMod { if (mat1.kind != ArrayMatrixKind.Normal || mat2.kind != ArrayMatrixKind.Normal) { return(mat1 * mat2); } var impl = new Impl <T>(Math.Max(Math.Max(mat1.Value.Length, mat2.Value.Length), Math.Max(mat1.Value[0].Length, mat2.Value[0].Length))); var rt = impl.Strassen(mat1.Value, mat2.Value); return(new ArrayMatrix <StaticModInt <T>, StaticModIntOperator <T> >(rt)); }
private ArrayMatrix <T, TOp> Add(ArrayMatrix <T, TOp> other) { Contract.Assert(Value.Length == other.Value.Length); Contract.Assert(Value[0].Length == other.Value[0].Length); var otherArr = other.Value; var arr = CloneArray(Value); for (int i = 0; i < arr.Length; i++) { for (int j = 0; j < arr[i].Length; j++) { arr[i][j] = op.Add(arr[i][j], otherArr[i][j]); } } return(new ArrayMatrix <T, TOp>(arr)); }