Changeset 287cc8 in git for ntl/src/mat_lzz_p.c
- Timestamp:
- Jan 5, 2010, 5:51:13 PM (14 years ago)
- Branches:
- (u'spielwiese', '2a584933abf2a2d3082034c7586d38bb6de1a30a')
- Children:
- 3c38b3810fd61108b01f123f5a91e13ccff52b20
- Parents:
- 1d43d184dd871d77c1ba8e095d768f22a0fbe92f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ntl/src/mat_lzz_p.c
r1d43d18 r287cc8 14 14 15 15 16 17 void add(mat_zz_p& X, const mat_zz_p& A, const mat_zz_p& B) 18 { 19 long n = A.NumRows(); 20 long m = A.NumCols(); 21 22 if (B.NumRows() != n || B.NumCols() != m) 23 Error("matrix add: dimension mismatch"); 24 25 X.SetDims(n, m); 26 27 long i, j; 28 for (i = 1; i <= n; i++) 29 for (j = 1; j <= m; j++) 30 add(X(i,j), A(i,j), B(i,j)); 31 } 32 33 void sub(mat_zz_p& X, const mat_zz_p& A, const mat_zz_p& B) 34 { 35 long n = A.NumRows(); 36 long m = A.NumCols(); 37 38 if (B.NumRows() != n || B.NumCols() != m) 39 Error("matrix sub: dimension mismatch"); 40 41 X.SetDims(n, m); 42 43 long i, j; 44 for (i = 1; i <= n; i++) 45 for (j = 1; j <= m; j++) 46 sub(X(i,j), A(i,j), B(i,j)); 47 } 48 16 17 void add(mat_zz_p& X, const mat_zz_p& A, const mat_zz_p& B) 18 { 19 long n = A.NumRows(); 20 long m = A.NumCols(); 21 22 if (B.NumRows() != n || B.NumCols() != m) 23 Error("matrix add: dimension mismatch"); 24 25 X.SetDims(n, m); 26 27 long i, j; 28 for (i = 1; i <= n; i++) 29 for (j = 1; j <= m; j++) 30 add(X(i,j), A(i,j), B(i,j)); 31 } 32 33 void sub(mat_zz_p& X, const mat_zz_p& A, const mat_zz_p& B) 34 { 35 long n = A.NumRows(); 36 long m = A.NumCols(); 37 38 if (B.NumRows() != n || B.NumCols() != m) 39 Error("matrix sub: dimension mismatch"); 40 41 X.SetDims(n, m); 42 43 long i, j; 44 for (i = 1; i <= n; i++) 45 for (j = 1; j <= m; j++) 46 sub(X(i,j), A(i,j), B(i,j)); 47 } 48 49 49 50 50 … … 55 55 56 56 57 static 58 void mul_aux(mat_zz_p& X, const mat_zz_p& A, const mat_zz_p& B) 59 { 60 long n = A.NumRows(); 61 long l = A.NumCols(); 62 long m = B.NumCols(); 63 64 if (l != B.NumRows()) 65 Error("matrix mul: dimension mismatch"); 66 67 X.SetDims(n, m); 57 static 58 void mul_aux(mat_zz_p& X, const mat_zz_p& A, const mat_zz_p& B) 59 { 60 long n = A.NumRows(); 61 long l = A.NumCols(); 62 long m = B.NumCols(); 63 64 if (l != B.NumRows()) 65 Error("matrix mul: dimension mismatch"); 66 67 X.SetDims(n, m); 68 68 69 69 if (m > 1) { // new preconditioning code … … 82 82 for (j = 0; j < m; j++) acc[j] = 0; 83 83 84 for (k = 0; k < l; k++) { 84 for (k = 0; k < l; k++) { 85 85 long aa = rep(ap[k]); 86 86 if (aa != 0) { … … 92 92 T1 = MulModPrecon(rep(bp[j]), aa, p, aapinv); 93 93 acc[j] = AddMod(acc[j], T1, p); 94 } 94 } 95 95 } 96 96 } … … 98 98 zz_p *xp = X[i].elts(); 99 99 for (j = 0; j < m; j++) 100 xp[j].LoopHole() = acc[j]; 100 xp[j].LoopHole() = acc[j]; 101 101 } 102 102 … … 107 107 double pinv = zz_p::ModulusInverse(); 108 108 109 long i, j, k; 110 long acc, tmp; 111 112 for (i = 1; i <= n; i++) { 113 for (j = 1; j <= m; j++) { 114 acc = 0; 115 for(k = 1; k <= l; k++) { 116 tmp = MulMod(rep(A(i,k)), rep(B(k,j)), p, pinv); 117 acc = AddMod(acc, tmp, p); 118 } 119 X(i,j).LoopHole() = acc; 120 } 121 } 122 123 } 124 } 125 126 void mul(mat_zz_p& X, const mat_zz_p& A, const mat_zz_p& B) 127 { 128 if (&X == &A || &X == &B) { 129 mat_zz_p tmp; 130 mul_aux(tmp, A, B); 131 X = tmp; 132 } 133 else 134 mul_aux(X, A, B); 135 } 109 long i, j, k; 110 long acc, tmp; 111 112 for (i = 1; i <= n; i++) { 113 for (j = 1; j <= m; j++) { 114 acc = 0; 115 for(k = 1; k <= l; k++) { 116 tmp = MulMod(rep(A(i,k)), rep(B(k,j)), p, pinv); 117 acc = AddMod(acc, tmp, p); 118 } 119 X(i,j).LoopHole() = acc; 120 } 121 } 122 123 } 124 } 125 126 void mul(mat_zz_p& X, const mat_zz_p& A, const mat_zz_p& B) 127 { 128 if (&X == &A || &X == &B) { 129 mat_zz_p tmp; 130 mul_aux(tmp, A, B); 131 X = tmp; 132 } 133 else 134 mul_aux(X, A, B); 135 } 136 136 137 137 … … 140 140 long l = a.length(); 141 141 long m = B.NumCols(); 142 143 if (l != B.NumRows()) 144 Error("matrix mul: dimension mismatch"); 145 146 if (m == 0) { 142 143 if (l != B.NumRows()) 144 Error("matrix mul: dimension mismatch"); 145 146 if (m == 0) { 147 147 148 148 x.SetLength(0); 149 149 150 150 } 151 151 else if (m == 1) { … … 157 157 long k; 158 158 159 acc = 0; 160 for(k = 1; k <= l; k++) { 161 tmp = MulMod(rep(a(k)), rep(B(k,1)), p, pinv); 162 acc = AddMod(acc, tmp, p); 163 } 159 acc = 0; 160 for(k = 1; k <= l; k++) { 161 tmp = MulMod(rep(a(k)), rep(B(k,1)), p, pinv); 162 acc = AddMod(acc, tmp, p); 163 } 164 164 165 165 x.SetLength(1); 166 166 x(1).LoopHole() = acc; 167 167 168 168 } 169 169 else { // m > 1. precondition … … 194 194 acc[j] = AddMod(acc[j], T1, p); 195 195 } 196 } 196 } 197 197 } 198 198 … … 200 200 zz_p *xp = x.elts(); 201 201 for (j = 0; j < m; j++) 202 xp[j].LoopHole() = acc[j]; 203 204 } 205 } 206 207 202 xp[j].LoopHole() = acc[j]; 203 204 } 205 } 206 207 208 208 void mul_aux(vec_zz_p& x, const mat_zz_p& A, const vec_zz_p& b) 209 209 { … … 258 258 259 259 xp[i].LoopHole() = acc; 260 } 261 262 } 263 } 264 265 void mul(vec_zz_p& x, const mat_zz_p& A, const vec_zz_p& b) 266 { 260 } 261 262 } 263 } 264 265 void mul(vec_zz_p& x, const mat_zz_p& A, const vec_zz_p& b) 266 { 267 267 if (&b == &x || A.position1(x) != -1) { 268 268 vec_zz_p tmp; … … 273 273 mul_aux(x, A, b); 274 274 275 } 275 } 276 276 277 277 … … 293 293 } 294 294 else { 295 295 296 296 long p = zz_p::modulus(); 297 297 double pinv = zz_p::ModulusInverse(); 298 298 long bb = rep(b); 299 299 mulmod_precon_t bpinv = PrepMulModPrecon(bb, p, pinv); 300 300 301 301 for (i = 0; i < n; i++) { 302 302 const zz_p *ap = A[i].elts(); … … 315 315 b = b_in; 316 316 mul(X, A, b); 317 } 318 319 320 321 322 323 324 void ident(mat_zz_p& X, long n) 325 { 326 X.SetDims(n, n); 327 long i, j; 328 329 for (i = 1; i <= n; i++) 330 for (j = 1; j <= n; j++) 331 if (i == j) 332 set(X(i, j)); 333 else 334 clear(X(i, j)); 335 } 317 } 318 319 320 321 322 323 324 void ident(mat_zz_p& X, long n) 325 { 326 X.SetDims(n, n); 327 long i, j; 328 329 for (i = 1; i <= n; i++) 330 for (j = 1; j <= n; j++) 331 if (i == j) 332 set(X(i, j)); 333 else 334 clear(X(i, j)); 335 } 336 336 337 337 … … 394 394 395 395 long T1 = rep(t1); 396 mulmod_precon_t t1pinv = PrepMulModPrecon(T1, p, pinv); // T1*pinv; 396 mulmod_precon_t t1pinv = PrepMulModPrecon(T1, p, pinv); // T1*pinv; 397 397 long T2; 398 398 … … 401 401 402 402 T2 = MulModPrecon(rep(*y), T1, p, t1pinv); 403 x->LoopHole() = AddMod(rep(*x), T2, p); 403 x->LoopHole() = AddMod(rep(*x), T2, p); 404 404 } 405 405 } … … 435 435 return 1; 436 436 } 437 437 438 438 439 439 void transpose(mat_zz_p& X, const mat_zz_p& A) … … 466 466 } 467 467 } 468 469 470 void solve(zz_p& d, vec_zz_p& X, 468 469 470 void solve(zz_p& d, vec_zz_p& X, 471 471 const mat_zz_p& A, const vec_zz_p& b) 472 472 … … 494 494 M.SetDims(n, n+1); 495 495 for (i = 0; i < n; i++) { 496 for (j = 0; j < n; j++) 496 for (j = 0; j < n; j++) 497 497 M[i][j] = A[j][i]; 498 498 M[i][n] = b[i]; … … 770 770 771 771 D[j] = i; 772 inv(inverses[j], M[i][j]); 772 inv(inverses[j], M[i][j]); 773 773 } 774 774 … … 800 800 } 801 801 } 802 803 804 805 806 807 void diag(mat_zz_p& X, long n, zz_p d) 808 { 809 X.SetDims(n, n); 810 long i, j; 811 812 for (i = 1; i <= n; i++) 813 for (j = 1; j <= n; j++) 814 if (i == j) 815 X(i, j) = d; 816 else 817 clear(X(i, j)); 818 } 802 803 804 805 806 807 void diag(mat_zz_p& X, long n, zz_p d) 808 { 809 X.SetDims(n, n); 810 long i, j; 811 812 for (i = 1; i <= n; i++) 813 for (j = 1; j <= n; j++) 814 if (i == j) 815 X(i, j) = d; 816 else 817 clear(X(i, j)); 818 } 819 819 820 820 long IsDiag(const mat_zz_p& A, long n, zz_p d)
Note: See TracChangeset
for help on using the changeset viewer.