Macaulay2 Engine
Loading...
Searching...
No Matches
franzi-interface.cpp
Go to the documentation of this file.
1/* This code written by Franziska Hinkelmann is in the public domain */
2
3#include "franzi-brp.hpp"
4#include "matrix-con.hpp"
5#include "matrix.hpp"
6
7extern void testSPolynomial();
8extern void gb(IntermediateBasis &F, int n);
9
11{
13 for (int i = 0; i < nvars; i++)
14 if (exp[i] != 0)
15 {
16 result += 1ul << (nvars - 1 - i);
17 // cout << "result " << result;
18 }
19 // cout << endl;
20 return result;
21}
22
23void longToExponents(int nvars, brMonomial mono, exponents_t exp)
24{
25 // cout << "longToExponents " << mono << endl;
26 for (int i = 0; i < nvars; i++)
27 {
28 exp[nvars - i - 1] = ((mono & 1ul) ? 1 : 0);
29 mono >>= 1;
30 // cout << "after shift longToExponents " << mono << endl;
31 }
32 // for( int i=0; i < nvars; i++ )
33 // {
34 // cout << exp[i] << " ";
35 // }
36 // cout << endl;
37 //
38}
39
41{
42 const Ring *R = m->get_ring();
44 assert(P != 0); // TODO: change this.
45 const Monoid *M = P->getMonoid();
46 int n = P->n_vars();
47 exponents_t exp = newarray_atomic(int, n);
49 for (int i = 0; i < m->n_cols(); i++)
50 {
51 vec v = m->elem(i);
52 if (v == nullptr) continue;
53 BRP temp;
54 for (Nterm& f : v->coeff)
55 {
56 M->to_expvector(f.monom, exp);
57 brMonomial mono = exponentsToLong(n, exp);
58 temp = temp + BRP(mono);
59 }
60 F[i] = temp;
61 }
62 freemem(exp);
63 return F;
64}
65
67{
69 const Monoid *M = P->getMonoid();
70 const Ring *K = P->getCoefficients();
71 int n = P->n_vars();
72 exponents_t exp = newarray_atomic(int, n);
73 monomial mon = M->make_one();
74 for (IntermediateBasis::const_iterator it = F.begin(); it != F.end(); ++it)
75 {
76 ring_elem f;
77 for (monomials::const_iterator it2 = it->second.m.begin();
78 it2 != it->second.m.end();
79 ++it2)
80 {
81 brMonomial mono = *it2;
82 // cout << "a single mono in brpstoMatrix " << mono << endl;
83 longToExponents(n, mono, exp);
84 // for( int i=0; i < n; i++ )
85 // {
86 // cout << exp[i] << " ";
87 // }
88 // cout << endl;
89 M->from_expvector(exp, mon);
90 ring_elem g = P->make_flat_term(K->one(), mon);
91 P->add_to(f, g);
92 }
93 C.append(P->make_vec(0, f));
94 }
95
96 freemem(exp);
97 return C.to_matrix();
98}
99
100extern "C" const Matrix *rawGbBoolean(const Matrix *m)
101{
103 // cout << "first BRP in F " << F.begin()->second << endl;
104 const Ring *R = m->get_ring();
106 if (P == nullptr)
107 {
108 ERROR("expected a polynomial ring");
109 return nullptr;
110 }
111 if (P->characteristic() != 2)
112 {
113 ERROR("expected coefficient ring ZZ/2");
114 return nullptr;
115 }
117 {
118 ERROR("expected coefficient ring ZZ/2");
119 return nullptr;
120 }
121 int n = P->n_vars();
122 if (n > 64)
123 {
124 ERROR("Cannot handle more than 64 variables yet");
125 return nullptr;
126 }
127 gb(F, n);
128 // cout << "first BRP in F after gb() " << F.begin()->second << endl;
129 return BRPStoMatrix(P, F);
130}
131
132// Local Variables:
133// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
134// indent-tabs-mode: nil
135// End:
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
Boolean (F_2-coefficient) polynomial stored as an ordered list of square-free monomials.
const Ring * get_ring() const
Definition matrix.hpp:134
ring_elem elem(int i, int j) const
Definition matrix.cpp:307
int n_cols() const
Definition matrix.hpp:147
Matrix * to_matrix()
void append(vec v)
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
void to_expvector(const_monomial m, exponents_t result_exp) const
Definition monoid.cpp:747
monomial make_one() const
Definition monoid.cpp:455
void from_expvector(const_exponents exp, monomial result) const
Definition monoid.cpp:742
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
const Ring * getCoefficientRing() const
Definition polyring.hpp:200
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const =0
virtual const Ring * getCoefficients() const
Definition polyring.hpp:277
int n_vars() const
Definition polyring.hpp:196
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
virtual FreeModule * make_FreeModule() const
Definition ring.cpp:53
vec make_vec(int r, ring_elem a) const
Definition ring-vecs.cpp:60
ring_elem one() const
Definition ring.hpp:357
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
long characteristic() const
Definition ring.hpp:159
void add_to(ring_elem &f, const ring_elem &g) const
Definition ring.cpp:205
virtual bool isFinitePrimeField() const
Definition ring.hpp:169
xxx xxx xxx
Definition ring.hpp:102
#define Matrix
Definition factory.cpp:14
unsigned long brMonomial
std::map< int, BRP > IntermediateBasis
brMonomial — bit-packed Boolean-ring monomials for the Hinkelmann GB engine.
void gb(IntermediateBasis &F, int n)
brMonomial exponentsToLong(int nvars, const_exponents exp)
IntermediateBasis BRPSfromMatrix(const Matrix *m)
void testSPolynomial()
const Matrix * BRPStoMatrix(const PolynomialRing *P, const IntermediateBasis &F)
void longToExponents(int nvars, brMonomial mono, exponents_t exp)
const Matrix * rawGbBoolean(const Matrix *m)
#define monomial
Definition gb-toric.cpp:11
void freemem(void *s)
Definition m2-mem.cpp:103
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
MatrixConstructor — the mutable builder that produces an immutable Matrix.
Matrix — the engine's immutable homomorphism F -> G between free modules.
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
int monom[1]
Definition ringelem.hpp:160
Singly linked-list node carrying one term of a polynomial-ring element.
Definition ringelem.hpp:156