source: git/Singular/dyn_modules/Order/nforder_ideal.cc @ b5dd9b

spielwiese
Last change on this file since b5dd9b was b5dd9b, checked in by Hans Schönemann <hannes@…>, 7 years ago
use include ".." for singular related .h, p1
  • Property mode set to 100644
File size: 7.4 KB
Line 
1#include "coeffs/bigintmat.h"
2#include "nforder.h"
3#include "reporter/reporter.h"
4#include "coeffs/numbers.h"
5#include "coeffs/coeffs.h"
6#include "Singular/ipid.h"
7#include "nforder_ideal.h"
8
9
10
11
12////////////////////////////////////
13//// Konstruktoren/Destruktoren ////
14////////////////////////////////////
15
16/*________________0_______________*/
17void nforder_ideal::init() {
18  memset(this, 0, sizeof(nforder_ideal));
19}
20
21nforder_ideal::nforder_ideal(bigintmat * _basis, const coeffs O) {
22  init();
23  ord = O;
24  basis = new bigintmat(_basis);
25}
26
27nforder_ideal::nforder_ideal(nforder_ideal *I, int) {
28  init();
29  ord = I->ord;
30  coeffs C = ((nforder *)ord->data)->basecoeffs();
31  basis = new bigintmat(I->basis);
32  if (I->den) {
33    den = n_Copy(I->den, C);
34  }
35  if (I->norm) {
36    norm = n_Copy(I->norm, C);
37    norm_den = n_Copy(I->norm_den, C);
38  }
39  if (I->min) {
40    min = n_Copy(I->min, C);
41    min_den = n_Copy(I->min_den, C);
42  }
43}
44
45void nforder_ideal::Write() {
46  coeffs C = ((nforder *)ord->data)->basecoeffs();
47  if (isFractional()) {
48    StringAppendS("Fractional ");
49  }
50  StringAppend("Ideal with basis:\n");
51  basis->Write();
52  if (isFractional()) {
53    number d;
54    StringAppend(" / ");
55    n_Write((d = viewBasisDen()), C);
56  }
57  StringAppendS("\n");
58  if (norm) {
59    StringAppendS("and norm ");
60    n_Write(norm, C);
61    StringAppendS(" / ");
62    n_Write(norm_den, C);
63    StringAppendS(" ");
64  }
65  if (min) {
66    StringAppendS("and min ");
67    n_Write(min, C);
68    StringAppendS(" / ");
69    n_Write(min_den, C);
70    StringAppendS(" ");
71  }
72}
73
74char * nforder_ideal::String() {
75  StringSetS("");
76  Write();
77  return StringEndS();
78}
79void nforder_ideal::Print() {
80  char * s = String();
81  PrintS(s);
82  PrintS("\n");
83  omFree(s);
84}
85
86nforder_ideal::~nforder_ideal() {
87  if (basis) delete basis;
88  coeffs C = ((nforder *)ord->data)->basecoeffs();
89  if (den) n_Delete(&den, C);
90  if (norm) {
91    n_Delete(&norm, C);
92    n_Delete(&norm_den, C);
93  }
94  if (min) {
95    n_Delete(&min, C);
96    n_Delete(&min_den, C);
97  }
98}
99
100#ifdef HAVE_RINGS
101nforder_ideal * nf_idAdd(nforder_ideal *A, nforder_ideal *B)
102{
103  assume(A->order() == B->order());
104  nforder * O = (nforder*) A->order()->data;
105  coeffs C = O->basecoeffs();
106  bigintmat * r = new bigintmat(O->getDim(), 2*O->getDim(), C),
107            *s1, *s2;
108  number den = NULL;
109  if (B->isFractional()) {
110    s1 = A->getBasis();
111    s1->skalmult(B->viewBasisDen(), C);
112    den = n_Copy(B->viewBasisDen(), C);
113  } else {
114    s1 = A->viewBasis();
115  }
116  if (A->isFractional()) {
117    s2 = B->getBasis();
118    s2->skalmult(A->viewBasisDen(), C);
119    if (den) {
120      number d = n_Mult(den, A->viewBasisDen(), C);
121      n_Delete(&den, C);
122      den = d;
123    } else {
124      den = n_Copy(A->viewBasisDen(), C);
125    }
126  } else {
127    s2 = B->viewBasis();
128  }
129  r->concatcol(s1, s2);
130
131  if (A->isFractional())
132    delete s2;
133  if (B->isFractional())
134    delete s1;
135
136  number modA = NULL, modB = NULL;
137  if (!(modA = A->viewMin())) {
138    modA = A->viewNorm();
139  }
140  if (!(modB = B->viewMin())) {
141    modB = B->viewNorm();
142  }
143  bigintmat *t2;
144  if (modA && modB) {
145    number mod = n_Gcd(modA, modB, C);
146    t2 = r->modhnf(mod, C);
147    n_Delete(&mod, C);
148  } else {
149    r->hnf();
150    t2 = new bigintmat(O->getDim(), O->getDim(), C);
151    t2->copySubmatInto(r, 1, O->getDim()+1, O->getDim(), O->getDim(), 1,1);
152  }
153  delete r;
154  if (den) {
155    t2->simplifyContentDen(&den);
156  }
157  nforder_ideal *D = new nforder_ideal(t2, A->order());
158  if (den)
159    D->setBasisDenTransfer(den);
160
161  if (O->oneIsOne())
162    D->setMinTransfer(t2->get(1,1), den ? n_Copy(den, C) : n_Init(1, C));
163  D->setNormTransfer(t2->det(), den ? n_Copy(den, C) : n_Init(1, C));
164  delete t2;
165  return D;
166}
167#endif
168
169#ifdef HAVE_RINGS
170nforder_ideal * nf_idMult(nforder_ideal *A, nforder_ideal *B)
171{
172  assume(A->order() == B->order());
173  nforder * O = (nforder*) A->order()->data;
174  coeffs C = O->basecoeffs();
175  number den = NULL;
176
177  bigintmat * r= NULL;
178  bigintmat * c = new bigintmat(O->getDim(), 1, C),
179            *rep = new bigintmat(O->getDim(), O->getDim(), C);
180  for(int i=0; i<O->getDim(); i++) {
181    A->viewBasis()->getcol(i+1, c);
182    O->multmap(c, rep);
183    bigintmat * cc = bimMult(rep, B->viewBasis());
184    if (r) {
185      bigintmat * s = new bigintmat(O->getDim(), r->cols()+O->getDim(), C);
186      s->concatcol(r, cc);
187      delete r;
188      delete cc;
189      r = s;
190    } else {
191      r = cc;
192    }
193  }
194  delete c;
195
196  number modA = NULL, modB = NULL;
197  if (!(modA = A->viewMin())) {
198    modA = A->viewNorm();
199  }
200  if (!(modB = B->viewMin())) {
201    modB = B->viewNorm();
202  }
203
204
205  bigintmat * t1;
206  if (modA && modB) {
207    number mod = n_Mult(modA, modB, C);
208    t1 = r->modhnf(mod, C);
209    n_Delete(&mod, C);
210  } else {
211    r->hnf();
212    t1 = new bigintmat(O->getDim(), O->getDim(), C);
213    r->getColRange(r->cols()-O->getDim()+1, O->getDim(), t1);
214  }
215  delete r;
216
217  if (A->isFractional()) {
218    den = A->viewBasisDen();
219  }
220  if (B->isFractional()) {
221    if (den)
222      den = n_Mult(den, B->viewBasisDen(), C);
223    else
224      den = n_Copy(B->viewBasisDen(), C);
225  }
226  if (den) {
227    t1->simplifyContentDen(&den);
228  }
229  nforder_ideal *D = new nforder_ideal(t1, A->order());
230  if (den)
231    D->setBasisDenTransfer(den);
232
233  if (O->oneIsOne())
234    D->setMinTransfer(t1->get(1,1), den ? n_Copy(den, C) : n_Init(1, C));
235  D->setNormTransfer(t1->det(), den ? n_Copy(den, C) : n_Init(1, C));
236  delete t1;
237  return D;
238}
239#endif
240
241nforder_ideal* nf_idMult(nforder_ideal * A, number b)
242{
243  nforder * O = (nforder*) A->order()->data;
244  coeffs C = O->basecoeffs();
245  bigintmat * r = O->elRepMat((bigintmat*) b);
246  bigintmat * s = bimMult(r, A->viewBasis());
247  delete r;
248  if (A->isFractional()) {
249    number d = n_Copy(A->viewBasisDen(), C);
250    s->simplifyContentDen(&d);
251    nforder_ideal * res = new nforder_ideal(s, A->order());
252    res->setBasisDenTransfer(d);
253    return res;
254  } else {
255    return new nforder_ideal(s, A->order());
256  }
257}
258
259nforder_ideal * nf_idInit(int i, coeffs O)
260{
261  nforder *ord = (nforder*) O->data;
262  coeffs C = ord->basecoeffs();
263  bigintmat * r = new bigintmat(ord->getDim(), ord->getDim(), C);
264  r->one();
265  number I = n_Init(i, C);
266  r->skalmult(I, C);
267  nforder_ideal * A = new nforder_ideal(r, O);
268  delete r;
269  number n;
270  n_Power(I, ord->getDim(), &n, C);
271  A->setNormTransfer(n, n_Init(1, C));
272  A->setMinTransfer(I, n_Init(1, C));
273  return A;
274}
275
276nforder_ideal * nf_idInit(number I, coeffs O)
277{
278  nforder *ord = (nforder*) O->data;
279  bigintmat * r = ord->elRepMat((bigintmat*)I);
280  nforder_ideal * A = new nforder_ideal(r, O);
281  delete r;
282  return A;
283}
284
285nforder_ideal* nf_idMult(nforder_ideal * A, int b)
286{
287  nforder * O = (nforder*) A->order()->data;
288  coeffs C = O->basecoeffs();
289  bigintmat * s = new bigintmat(A->viewBasis());
290  number bb = n_Init(b, C);
291  s->skalmult(bb, C);
292  n_Delete(&bb, C);
293
294  if (A->isFractional()) {
295    number d = n_Copy(A->viewBasisDen(), C);
296    s->simplifyContentDen(&d);
297    nforder_ideal * res = new nforder_ideal(s, A->order());
298    res->setBasisDenTransfer(d);
299    return res;
300  } else {
301    return new nforder_ideal(s, A->order());
302  }
303}
304
305nforder_ideal* nf_idPower(nforder_ideal* A, int i)
306{
307  if (i==0) {
308    return nf_idInit(1, A->order());
309  } else if (i==1) {
310    return new nforder_ideal(A, 1);
311  } else if (i<0) {
312    Werror("not done yet");
313  } else {
314    nforder_ideal *B = nf_idPower(A, i/2);
315    nforder_ideal *res = nf_idMult(B, B);
316    delete B;
317    if (i&1) {
318      nforder_ideal * C = nf_idMult(res, B);
319      delete res;
320      return C;
321    } else {
322      return res;
323    }
324  }
325}
Note: See TracBrowser for help on using the repository browser.