Frobby 0.9.5
fourti2.cpp
Go to the documentation of this file.
1/* Frobby: Software for monomial ideal computations.
2 Copyright (C) 2007 Bjarke Hammersholt Roune (www.broune.com)
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see http://www.gnu.org/licenses/.
16*/
17#include "stdinc.h"
18#include "fourti2.h"
19
20#include "BigIdeal.h"
21#include "Scanner.h"
22#include "IOHandler.h"
23#include "error.h"
24
25namespace fourti2 {
26 void readTerm(BigIdeal& ideal, Scanner& scanner) {
27 ideal.newLastTerm();
28
29 mpz_class tmp;
31
32 if (tmp > 0)
33 reportError("Encountered positive entry as first entry in term. "
34 "This is impossible if using the required degree reverse "
35 "lexicographic term order.\n");
36
37 for (size_t i = 0; i < ideal.getVarCount(); ++i) {
39 if (tmp > 0)
40 ideal.getLastTermExponentRef(i) = tmp;
41 }
42 }
43
44 void readGrobnerBasis(Scanner& scanner, BigIdeal& basis) {
45 size_t termCount;
46 size_t varCount;
47
48 scanner.readSizeT(termCount);
49 scanner.readSizeT(varCount);
50
51 if (varCount == 0)
53 ("The matrix defining the Frobenius-related Grobner basis must "
54 "have at least one column, and this one has none.");
55
56 VarNames names(varCount - 1);
57 basis.clearAndSetNames(names);
58
59 for (size_t i = 0; i < termCount; ++i)
60 readTerm(basis, scanner);
61 }
62
63 void readLatticeBasis(Scanner& scanner, BigIdeal& basis) {
64 size_t rowCount;
65 size_t columnCount;
66
67 scanner.readSizeT(rowCount);
68 scanner.readSizeT(columnCount);
69
70 VarNames names(columnCount);
71 basis.clearAndSetNames(names);
72
73 for (unsigned int i = 0; i < rowCount; ++i) {
74 basis.newLastTerm();
75 for (unsigned int j = 0; j < columnCount; ++j)
76 scanner.readInteger(basis.getLastTermExponentRef(j));
77 }
78 }
79
80 void writeLatticeBasis(FILE* out, const BigIdeal& basis) {
81 fprintf(out, "%lu %lu\n",
82 (unsigned long)basis.getGeneratorCount(),
83 (unsigned long)basis.getVarCount());
84 for (unsigned int i = 0; i < basis.getGeneratorCount(); ++i) {
85 const char* prefix = "";
86 for (unsigned int j = 0; j < basis[i].size(); ++j) {
87 gmp_fprintf(out, "%s%Zd", prefix, basis[i][j].get_mpz_t());
88 prefix = " ";
89 }
90 fputc('\n', out);
91 }
92 }
93}
void clearAndSetNames(const VarNames &names)
Definition BigIdeal.cpp:222
void newLastTerm()
Definition BigIdeal.cpp:104
mpz_class & getLastTermExponentRef(size_t var)
Definition BigIdeal.h:126
size_t getVarCount() const
Definition BigIdeal.h:148
size_t getGeneratorCount() const
Definition BigIdeal.h:144
This class offers an input interface which is more convenient and for some purposes more efficient th...
Definition Scanner.h:50
void readIntegerAndNegativeAsZero(mpz_class &integer)
Read an integer and set it to zero if it is negative.
Definition Scanner.cpp:171
void readSizeT(size_t &size)
Reads a size_t, where the representable range of that type determines when the number is too big.
Definition Scanner.cpp:205
void readInteger(mpz_class &integer)
Read an arbitrary-precision integer.
Definition Scanner.h:238
Defines the variables of a polynomial ring and facilities IO involving them.
Definition VarNames.h:40
void reportError(const string &errorMsg)
Definition error.cpp:23
void readGrobnerBasis(Scanner &scanner, BigIdeal &basis)
Definition fourti2.cpp:44
void readTerm(BigIdeal &ideal, Scanner &scanner)
Definition fourti2.cpp:26
void readLatticeBasis(Scanner &scanner, BigIdeal &basis)
Definition fourti2.cpp:63
void writeLatticeBasis(FILE *out, const BigIdeal &basis)
Definition fourti2.cpp:80
This header file includes common definitions and is included as the first line of code in every imple...