My Project
nforder_ideal.cc
Go to the documentation of this file.
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_______________*/
18 memset(this, 0, sizeof(nforder_ideal));
19}
20
22 init();
23 ord = O;
24 basis = new bigintmat(_basis);
25}
26
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
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
75 StringSetS("");
76 Write();
77 return StringEndS();
78}
80 char * s = String();
81 PrintS(s);
82 PrintS("\n");
83 omFree(s);
84}
85
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
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) {
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
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) {
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
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
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
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
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
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 return NULL;
314 } else {
317 delete B;
318 if (i&1) {
320 delete res;
321 return C;
322 } else {
323 return res;
324 }
325 }
326}
bigintmat * bimMult(bigintmat *a, bigintmat *b)
Definition: bigintmat.cc:255
CF_NO_INLINE FACTORY_PUBLIC CanonicalForm mod(const CanonicalForm &, const CanonicalForm &)
CanonicalForm den(const CanonicalForm &f)
int i
Definition: cfEzgcd.cc:132
CanonicalForm b
Definition: cfModGcd.cc:4103
Matrices of numbers.
Definition: bigintmat.h:51
number det()
det (via LaPlace in general, hnf for euc. rings)
Definition: bigintmat.cc:1512
void hnf()
transforms INPLACE to HNF
Definition: bigintmat.cc:1660
int cols() const
Definition: bigintmat.h:144
bigintmat * modhnf(number p, coeffs c)
computes HNF(this | p*I)
Definition: bigintmat.cc:1832
void Write()
IO: writes the matrix into the current internal string buffer which must be started/ allocated before...
Definition: bigintmat.cc:413
bool skalmult(number b, coeffs c)
Multipliziert zur Matrix den Skalar b hinzu.
Definition: bigintmat.cc:938
void simplifyContentDen(number *den)
ensures that Gcd(den, content)=1 enden hier wieder
Definition: bigintmat.cc:2688
number get(int i, int j) const
get a copy of an entry. NOTE: starts at [1,1]
Definition: bigintmat.cc:119
void getColRange(int j, int no, bigintmat *a)
copies the no-columns staring by j (so j...j+no-1) into the pre-allocated a
Definition: bigintmat.cc:778
void concatcol(bigintmat *a, bigintmat *b)
Definition: bigintmat.cc:1098
void copySubmatInto(bigintmat *, int sr, int sc, int nr, int nc, int tr, int tc)
copy the submatrix of b, staring at (a,b) having n rows, m cols into the given matrix at pos....
Definition: bigintmat.cc:1287
void one()
Macht Matrix (Falls quadratisch) zu Einheitsmatrix.
Definition: bigintmat.cc:1325
nforder_ideal()
0 Konstruktoren/Destruktoren ///
char * String()
int isFractional()
Definition: nforder_ideal.h:49
bigintmat * basis
Definition: nforder_ideal.h:19
number viewBasisDen()
Definition: nforder_ideal.h:48
bool oneIsOne()
Definition: nforder.h:84
void multmap(bigintmat *a, bigintmat *m)
Definition: nforder.cpp:404
coeffs basecoeffs() const
Definition: nforder.h:76
bigintmat * elRepMat(bigintmat *a)
Definition: nforder.cpp:395
int getDim()
Definition: nforder.cpp:235
Coefficient rings, fields and other domains suitable for Singular polynomials.
static FORCE_INLINE number n_Mult(number a, number b, const coeffs r)
return the product of 'a' and 'b', i.e., a*b
Definition: coeffs.h:633
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
Definition: coeffs.h:448
static FORCE_INLINE number n_Gcd(number a, number b, const coeffs r)
in Z: return the gcd of 'a' and 'b' in Z/nZ, Z/2^kZ: computed as in the case Z in Z/pZ,...
Definition: coeffs.h:661
static FORCE_INLINE void n_Power(number a, int b, number *res, const coeffs r)
fill res with the power a^b
Definition: coeffs.h:629
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
Definition: coeffs.h:452
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
Definition: coeffs.h:588
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
Definition: coeffs.h:535
#define StringAppend
Definition: emacs.cc:79
const CanonicalForm int s
Definition: facAbsFact.cc:51
CanonicalForm res
Definition: facAbsFact.cc:60
b *CanonicalForm B
Definition: facBivar.cc:52
#define D(A)
Definition: gentable.cc:131
#define assume(x)
Definition: mod2.h:389
The main handler for Singular numbers which are suitable for Singular polynomials.
nforder_ideal * nf_idMult(nforder_ideal *A, nforder_ideal *B)
nforder_ideal * nf_idPower(nforder_ideal *A, int i)
nforder_ideal * nf_idInit(int i, coeffs O)
nforder_ideal * nf_idAdd(nforder_ideal *A, nforder_ideal *B)
#define omFree(addr)
Definition: omAllocDecl.h:261
#define NULL
Definition: omList.c:12
void StringSetS(const char *st)
Definition: reporter.cc:128
void StringAppendS(const char *st)
Definition: reporter.cc:107
void PrintS(const char *s)
Definition: reporter.cc:284
char * StringEndS()
Definition: reporter.cc:151
void Werror(const char *fmt,...)
Definition: reporter.cc:189
#define A
Definition: sirandom.c:24