MCPcopy Create free account
hub / github.com/Singular/Singular / elMult

Method elMult

Singular/dyn_modules/Order/nforder.cpp:321–374  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

319}
320
321void nforder::elMult(bigintmat *a, bigintmat *b) {
322 if ((a->cols() != 1) || (a->rows() != dimension) || (b->cols() != 1) || (b->rows() != dimension)) {
323 // Kein Zeilenvektor der korrekten Größe
324 Werror("Error in elMult");
325 }
326
327 coeffs C = a->basecoeffs();
328 assume(C == b->basecoeffs());
329 assume(C == this->basecoeffs());
330
331 if (multtable != NULL) {
332 // Multiplikation mit Hilfe von Multiplikationstabelle
333 // Zu Grunde liegende Formel: Basis w_i; Für alpha = sum a_i*w_i und beta = sum b_i*w_i gilt:
334 // alpha*beta = sum sum a_i*b_j*w_i*w_j
335 bigintmat *sum = new bigintmat(dimension, 1, C);
336 bigintmat *tmp = new bigintmat(dimension, 1, C);
337 number ntmp;
338
339 for (int i=1; i<=dimension; i++) {
340 // Laufe mit i durch Basiselemente
341 for (int j=1; j<=dimension; j++) {
342 // Laufe mit j durch Basiselemente
343 // Speichere Produkt von Basiselem. i mit Basiselem. j als Koeff.vektor in tmp
344
345 multtable[i-1]->getcol(j, tmp);
346 // Multipliziere ihn mit a[i] und b[j]
347 ntmp = n_Mult(a->view(i, 1), b->view(j, 1), C);
348 tmp->skalmult(ntmp, C);
349
350 n_Delete(&ntmp, C);
351 // und addiere alles auf
352 sum->add(tmp);
353 }
354 }
355 delete tmp;
356 // Am Ende überschreibe a mit dem Ergebnis
357 for (int i=0; i<dimension; i++)
358 a->set(i+1, 1, sum->get(i+1, 1));
359 delete sum;
360 } else {
361 // Multiplikation mit hilfe von baseorder:
362 bigintmat *sumb = new bigintmat(dimension, 1, C);
363 // Produkt von a (b) mit basis liefert Koeff-Vektor von a*divisor (b*divisor) in baseorder
364 bimMult(basis, a, a);
365 bimMult(basis, b, sumb);
366 // Multipliziere Elemente in baseorder (und speichere in suma)
367 baseorder->elMult(a, sumb);
368 delete sumb;
369 a->skaldiv(divisor);
370 bimMult(inv_basis, a, a);
371 a->skaldiv(inv_divisor);
372 a->skaldiv(divisor);
373 }
374}
375
376
377//TODO: compute the trace from the mult-table without

Callers 2

EltMultFunction · 0.80
radicalmodpbaseFunction · 0.80

Calls 14

basecoeffsMethod · 0.95
WerrorFunction · 0.85
n_MultFunction · 0.85
n_DeleteFunction · 0.85
bimMultFunction · 0.85
colsMethod · 0.80
rowsMethod · 0.80
getcolMethod · 0.80
skalmultMethod · 0.80
skaldivMethod · 0.80
viewMethod · 0.45
addMethod · 0.45

Tested by

no test coverage detected