Macaulay2 Engine
Loading...
Searching...
No Matches
RingZZTest.cpp
Go to the documentation of this file.
1// Copyright 2013 Michael E. Stillman
2
33
34#include "RingTest.hpp"
35#include <limits>
36
37static bool maxH_initialized = false;
38static mpz_t maxH;
39
40template <>
42{
43 if (index < 50) return R.from_long(index - 25);
45 {
46 maxH_initialized = true;
47 mpz_init(maxH);
48 mpz_set_str(maxH, "100000000000", 10);
49 }
51 return R.from_int(a1);
52}
53
55TEST(RingZZ, create)
56{
57 EXPECT_TRUE(globalZZ != nullptr);
58
59 EXPECT_TRUE(dynamic_cast<const RingZZ*>(globalZZ) != nullptr);
60 EXPECT_EQ(globalZZ->coefficient_type(), Ring::COEFF_ZZ);
61 EXPECT_TRUE(globalZZ->is_ZZ());
62 EXPECT_EQ(ringName(*globalZZ), "ZZ");
63}
65{
66 EXPECT_TRUE(globalZZ->is_equal(globalZZ->one(), globalZZ->from_long(1)));
67 EXPECT_TRUE(
68 globalZZ->is_equal(globalZZ->minus_one(), globalZZ->from_long(-1)));
69 EXPECT_TRUE(globalZZ->is_equal(globalZZ->zero(), globalZZ->from_long(0)));
70 EXPECT_TRUE(globalZZ->is_zero(globalZZ->from_long(0)));
71}
72TEST(RingZZ, random)
73{
74 mpz_t b;
75 mpz_init(b);
76 mpz_t maxH;
77 mpz_init(maxH);
78 mpz_set_str(maxH, "100000000000", 10);
79 for (int i = 0; i <= 10; i++)
80 {
81 buffer o;
82 ring_elem a =
83 globalZZ->random(); // POOR DESIGN! Need to be able to choose size
84 gmp_ZZ a1 = rawRandomInteger(maxH); // This one is fine
85 a = globalZZ->from_int(a1);
86 globalZZ->elem_text_out(o, a);
87 // std::cout << o.str() << std::endl;
88 mpz_set_str(b, o.str(), 10);
89 ring_elem c = globalZZ->from_int(b);
90 EXPECT_TRUE(globalZZ->is_equal(a, c));
91 }
92 mpz_clear(maxH);
93 mpz_clear(b);
94}
95TEST(RingZZ, get_si)
96{
97 mpz_t a;
98 mpz_init(a);
99 long minint = std::numeric_limits<int>::min();
100 long maxint = std::numeric_limits<int>::max();
101 long i = minint - 5;
102 while (i < maxint + 5)
103 {
104 mpz_set_si(a, i);
105 auto b = RingZZ::get_si(a);
106 // std::cout << "(min,max)=" << minint << "," << maxint
107 // << " " << "i=" << i
108 // << " ok=" << b.first << " result=" << b.second <<
109 // std::endl;
110 if (i >= minint and i <= maxint)
111 {
112 EXPECT_TRUE(b.first);
113 EXPECT_EQ(b.second, i);
114 }
115 else
116 {
117 EXPECT_FALSE(b.first);
118 }
119 if (i == minint + 5)
120 i = maxint - 5;
121 else
122 ++i;
123 }
124 mpz_clear(a);
125}
129TEST(RingZZ, multDivide)
130{
132
133 // I would prefer for 'divide' to be exact division, with a return value of
134 // false, if not exactly divisible
135 ring_elem a = globalZZ->from_long(5);
136 ring_elem b = globalZZ->from_long(2);
137 EXPECT_THROW(globalZZ->divide(a, b), exc::engine_error);
138 // ring_elem c = globalZZ->divide(a, b);
139 // EXPECT_ANY_THROW(globalZZ->is_equal(c, globalZZ->from_long(2)));
140}
144{
146 const RingZZ* R = globalZZ;
147
149 for (int i = 0; i < ntrials; i++)
150 {
151 ring_elem a = gen.nextElement();
152 ring_elem b = gen.nextElement();
153
154 // (a // gcd(a,b) == 0, b // gcd(a,b) == 0,
155 ring_elem c = R->gcd(a, b);
156 ring_elem u, v;
157 ring_elem d = R->gcd_extended(a, b, u, v);
158
159 EXPECT_TRUE(globalZZ->is_positive(c));
160
161 EXPECT_TRUE(R->is_equal(c, d));
162 EXPECT_TRUE(R->is_equal(c, R->add(R->mult(a, u), R->mult(b, v))));
163 EXPECT_TRUE(R->is_equal(a, R->mult(R->divide(a, c), c)));
164 }
165
166 EXPECT_TRUE(R->is_equal(R->zero(), R->gcd(R->zero(), R->zero())));
167 EXPECT_TRUE(R->is_equal(R->one(), R->gcd(R->one(), R->minus_one())));
168 EXPECT_TRUE(R->is_equal(R->one(), R->gcd(R->minus_one(), R->minus_one())));
169}
172TEST(RingZZ, content)
173{
174 buffer o;
175 ring_elem a = globalZZ->from_long(-10);
176 ring_elem b = globalZZ->from_long(-15);
177 ring_elem c = globalZZ->from_long(-5);
178 ring_elem d = globalZZ->from_long(5);
179 globalZZ->is_equal(d, globalZZ->preferred_associate(c));
180
181 ring_elem e = globalZZ->from_long(0);
182 bool ret1 = globalZZ->lower_associate_divisor(e, a);
183 o << "ret1=" << (ret1 ? "true" : "false") << " e=";
184 globalZZ->elem_text_out(o, e);
185 o << newline;
186 bool ret2 = globalZZ->lower_associate_divisor(e, b);
187 o << "ret2=" << (ret2 ? "true" : "false") << " e=";
188 globalZZ->elem_text_out(o, e);
189 o << newline;
190 std::cout << o.str();
191}
192
193// Local Variables:
194// compile-command: "make -C $M2BUILDDIR/Macaulay2/e/unit-tests check "
195// indent-tabs-mode: nil
196// End:
const int ntrials
Definition ARingTest.hpp:42
std::string ringName(const T &R)
static bool maxH_initialized
static mpz_t maxH
void testRingPower(const T *R, int ntrials)
Definition RingTest.hpp:201
void testRingDivide(const T *R, int ntrials)
Definition RingTest.hpp:140
void testRingSyzygy(const T *R, int ntrials)
Definition RingTest.hpp:273
void testRingGCD(const T *R, int ntrials)
Definition RingTest.hpp:229
void testRingAxioms(const T *R, int ntrials)
Definition RingTest.hpp:164
void testRingRemainder(const T *R, int ntrials)
Definition RingTest.hpp:248
void testRingAdd(const T *R, int ntrials)
Definition RingTest.hpp:111
void testRingSubtract(const T *R, int ntrials)
Definition RingTest.hpp:126
void testRingNegate(const T *R, int ntrials)
Definition RingTest.hpp:98
Shared gtest fixture for the legacy Ring-based Ring*Test.cpp suite.
TEST(RingZZ, create)
ring_elem getElement< RingZZ >(const RingZZ &R, int index)
ring_elem one() const
Definition ring.hpp:357
ring_elem zero() const
Definition ring.hpp:359
ring_elem minus_one() const
Definition ring.hpp:358
@ COEFF_ZZ
Definition ring.hpp:222
ring_elem nextElement()
Definition RingTest.hpp:83
virtual ring_elem add(const ring_elem f, const ring_elem g) const
Definition ZZ.cpp:251
virtual ring_elem from_long(long n) const
Definition ZZ.cpp:110
virtual ring_elem from_int(mpz_srcptr n) const
Definition ZZ.cpp:119
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
Definition ZZ.cpp:304
static std::pair< bool, int > get_si(mpz_srcptr n)
Definition ZZ.cpp:46
ring_elem gcd(const ring_elem f, const ring_elem g) const
Definition ZZ.cpp:361
virtual bool is_equal(const ring_elem f, const ring_elem g) const
Definition ZZ.cpp:161
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
Definition ZZ.cpp:267
ring_elem gcd_extended(const ring_elem f, const ring_elem g, ring_elem &u, ring_elem &v) const
Definition ZZ.cpp:369
Engine-side ring of integers, backed by GMP mpz_ptr elements.
Definition ZZ.hpp:77
char * str()
Definition buffer.hpp:72
RingZZ * globalZZ
Definition relem.cpp:13
void subtract(int &result, int a, int b)
char newline[]
Definition m2-types.cpp:49
mpz_srcptr gmp_ZZ
Definition m2-types.h:141
std::ostringstream & ones(std::ostringstream &o, int len)
gmp_ZZ rawRandomInteger(gmp_ZZ maxN)
Definition random.cpp:66