/* c = a*b */ void RecMult(int n, matrix a, matrix b, matrix c) { matrix d; if (n <= block) { double sum, **p = a->d, **q = b->d, **r = c->d; int i, j, k; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { for (sum = 0., k = 0; k < n; k++) sum += p[i][k] * q[k][j]; r[i][j] = sum; } } } else { d=newmatrix(n); n /= 2; RecMult(n, a11, b11, d11); RecMult(n, a12, b21, c11); RecAdd(n, d11, c11, c11); RecMult(n, a11, b12, d12); RecMult(n, a12, b22, c12); RecAdd(n, d12, c12, c12); RecMult(n, a21, b11, d21); RecMult(n, a22, b21, c21); RecAdd(n, d21, c21, c21); RecMult(n, a21, b12, d22); RecMult(n, a22, b22, c22); RecAdd(n, d22, c22, c22); freematrix(d,n*2); } }
/* c = a+b */ void RecAdd(int n, matrix a, matrix b, matrix c) { if (n <= block) { double **p = a->d, **q = b->d, **r = c->d; int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) r[i][j] = p[i][j] + q[i][j]; } else { n /= 2; RecAdd(n, a11, b11, c11); RecAdd(n, a12, b12, c12); RecAdd(n, a21, b21, c21); RecAdd(n, a22, b22, c22); } }
/*Recursive Strassen Multiplication*/ void StrassenMult(int n, matrix a, matrix b, matrix c) { matrix t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,q1,q2,q3,q4,q5,q6,q7; if (n <= block) { double sum, **p = a->d, **q = b->d, **r = c->d; int i, j, k; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { for (sum = 0., k = 0; k < n; k++) sum += p[i][k] * q[k][j]; r[i][j] = sum; } } } else { n /= 2; t1=newmatrix(n); t2=newmatrix(n); t3=newmatrix(n); t4=newmatrix(n); t5=newmatrix(n); t6=newmatrix(n); t7=newmatrix(n); t8=newmatrix(n); t9=newmatrix(n); t10=newmatrix(n); q1=newmatrix(n); q2=newmatrix(n); q3=newmatrix(n); q4=newmatrix(n); q5=newmatrix(n); q6=newmatrix(n); q7=newmatrix(n); RecAdd(n,a11,a22,t1); RecAdd(n,b11,b22,t2); RecAdd(n,a21,a22,t3); RecSub(n,b12,b22,t4); RecSub(n,b21,b11,t5); RecAdd(n,a11,a12,t6); RecSub(n,a21,a11,t7); RecAdd(n,b11,b12,t8); RecSub(n,a12,a22,t9); RecAdd(n,b21,b22,t10); StrassenMult(n,t1,t2,q1); StrassenMult(n,t3,b11,q2); StrassenMult(n,a11,t4,q3); StrassenMult(n,a22,t5,q4); StrassenMult(n,t6,b22,q5); StrassenMult(n,t7,t8,q6); StrassenMult(n,t9,t10,q7); RecAdd(n,q1,q4,c11); RecSub(n,c11,q5,c11); RecAdd(n,q7,c11,c11); RecAdd(n,q3,q5,c12); RecAdd(n,q2,q4,c21); RecAdd(n,q1,q3,c22); RecAdd(n,q6,c22,c22); RecSub(n,c22,q2,c22); freematrix(t1,n); freematrix(t2,n); freematrix(t3,n); freematrix(t4,n); freematrix(t5,n); freematrix(t6,n); freematrix(t7,n); freematrix(t8,n); freematrix(t9,n); freematrix(t10,n); freematrix(q1,n); freematrix(q2,n); freematrix(q3,n); freematrix(q4,n); freematrix(q5,n); freematrix(q6,n); freematrix(q7,n); } }