The Original CHomP Software
integer.h
Go to the documentation of this file.
1
3
16
17// Copyright (C) 1997-2020 by Pawel Pilarczyk.
18//
19// This file is part of my research software package. This is free software:
20// you can redistribute it and/or modify it under the terms of the GNU
21// General Public License as published by the Free Software Foundation,
22// either version 3 of the License, or (at your option) any later version.
23//
24// This software is distributed in the hope that it will be useful,
25// but WITHOUT ANY WARRANTY; without even the implied warranty of
26// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27// GNU General Public License for more details.
28//
29// You should have received a copy of the GNU General Public License
30// along with this software; see the file "license.txt". If not,
31// please, see <https://www.gnu.org/licenses/>.
32
33// Started in December 1999. Last revision: July 4, 2005.
34
35
36#ifndef _CHOMP_STRUCT_INTEGER_H_
37#define _CHOMP_STRUCT_INTEGER_H_
38
39#include "chomp/system/config.h"
41
42#include <iostream>
43
44namespace chomp {
45namespace homology {
46
47
48// classes defined in this module (in this order):
49class primeint;
50class integer;
51
52
53// --------------------------------------------------
54// ------------------ prime number ------------------
55// --------------------------------------------------
56
60{
61public:
64 primeint (int_t k = 0);
65
67 primeint &operator = (const primeint &p);
68
72
75 operator int_t () const;
76
77private:
80
81}; /* class primeint */
82
83// --------------------------------------------------
84
85inline primeint::operator int_t () const
86{
87 return n;
88} /* primeint::operator int_t */
89
91{
92 n = p. n;
93 return *this;
94} /* primeint::operator = */
95
96// --------------------------------------------------
97
99inline std::ostream &operator << (std::ostream &out, const primeint &p)
100{
101 out << static_cast<int_t> (p);
102 return out;
103} /* operator << */
104
108inline std::istream &operator >> (std::istream &in, primeint &p)
109{
110 int_t n;
111 in >> n;
112 p = n;
113 return in;
114} /* operator >> */
115
116
117// --------------------------------------------------
118// -------------------- integer ---------------------
119// --------------------------------------------------
120
126typedef signed short numbertype;
127
134{
135public:
136 // default constructor
137 // explicit integer (int n = 0);
138
139 // The destructor.
140 // ~integer (void);
141
142 // copying constructor
143 // integer (const integer &e);
144
145 // assignment operator(s)
146 integer &operator = (int n);
147 // integer &operator = (const integer &e);
148
149 // initialize the integers:
150 // define integers modulo p or set p to 0 (default)
151 static int initialize (int n);
152
153 // the function "delta": equal to 0 on 0,
154 // equal to 1 on invertibles, otherwise > 1
155 int delta (void) const;
156
157 // a normalized number (a better representant for homology)
158 integer normalized () const;
159
160 // several operators
161 integer operator - () const;
162 integer &operator += (const integer &n);
163 integer &operator *= (const integer &n);
164 integer operator + (const integer &n) const;
165 integer operator * (const integer &n) const;
166 integer operator / (const integer &n) const;
167 integer operator % (const integer &n) const;
168 int operator == (const integer &n) const;
169
170 static const char *ringname ();
171 static const char *ringsymbol ();
172
173 friend std::ostream &operator << (std::ostream &out, const integer &n);
174 friend bool operator < (const integer &x, const integer &y);
175 friend bool operator > (const integer &x, const integer &y);
176
177 protected:
178 // the number modulo which the computations are performed
179 static int p;
180
181 // the integer number
183
184 // various additional procedures
185 static int cut_down (int n);
186 static int is_prime (int n);
187 static int prime_number (int n);
188 static unsigned invert (unsigned n, unsigned q);
189
190}; /* class integer */
191
192// --------------------------------------------------
193
194inline int integer::cut_down (int n)
195{
196 if (n >= 0)
197 if (n < p)
198 return n;
199 else
200 return (n % p);
201 else
202 {
203 int num = p - ((-n) % p);
204 if (num == p)
205 return 0;
206 else
207 return num;
208 }
209} /* cut_down */
210
211/* inline integer::integer (int n)
212{
213 if (p)
214 num = (numbertype) cut_down (n);
215 else
216 {
217 num = (numbertype) n;
218 if ((long) num != (long) n)
219 throw "Number out of range at initialization.";
220 }
221 return;
222} */ /* integer::integer */
223
224/* inline integer::~integer ()
225{
226 return;
227} */ /* integer::~integer */
228
229/* inline integer::integer (const integer &e)
230{
231 num = e. num;
232 return;
233} */ /* integer::integer */
234
235/* inline integer &integer::operator = (const integer &e)
236{
237 num = e. num;
238 return *this;
239} */ /* integer::operator = */
240
242{
243 if (p)
244 num = (numbertype) cut_down (n);
245 else
246 {
247 num = (numbertype) n;
248 if ((long) num != (long) n)
249 throw "Number out of range at assignment.";
250 }
251 return *this;
252} /* integer::operator = */
253
255{
256 integer result;
257 if (p)
258 result = num * (int) invert (n. num, p);
259 else
260 result. num = (numbertype) (num / n. num);
261 return result;
262} /* integer::operator / */
263
265{
266 integer result;
267 if (p)
268 result. num = 0;
269 else
270 result = num % n. num;
271 return result;
272} /* operator % */
273
275{
276 if (p)
277 {
278 integer negative;
279 negative. num = (numbertype) (p - num);
280 return negative;
281 }
282 else
283 {
284 numbertype result = (numbertype) -num;
285 if ((long) result + (long) num != 0)
286 throw "Number out of range (unary -).";
287 integer intresult;
288 intresult = result;
289 return intresult;
290 }
291} /* integer::operator - (unary) */
292
294{
295 if (!p)
296 if (((n. num >= 0) && (num + n. num < num)) ||
297 ((n. num < 0) && (num + n. num > num)))
298 throw "Number out of range (+).";
299 num += n. num;
300 if (p)
301 if (num >= p)
302 num -= (numbertype) p;
303 return *this;
304} /* integer::operator += */
305
307{
308 if (p)
309 {
310 long result = (long) num * (long) n. num;
311 if (result >= 0)
312 num = (numbertype) (result % p);
313 else
314 {
315 num = (numbertype) (p - ((-result) % p));
316 if (num == p)
317 num = 0;
318 }
319 }
320 else
321 {
322 long result = (long) num * (long) (n. num);
323 num = (numbertype) result;
324 if ((long) num != result)
325 throw "Number out of range (*).";
326 }
327 return *this;
328} /* integer::operator *= */
329
331{
332 integer m (n);
333 m += *this;
334 return m;
335} /* operator + */
336
338{
339 integer m (n);
340 m *= *this;
341 return m;
342} /* operator * */
343
344inline int integer::operator == (const integer &n) const
345{
346 return (n. num == num);
347} /* operator == */
348
349inline std::ostream &operator << (std::ostream &out, const integer &n)
350{
351 out << (long) n. num;
352 return out;
353} /* operator << */
354
355inline std::istream &operator >> (std::istream &in, integer &n)
356{
357 long number;
358 in >> number;
359 if (!in)
360 return in;
361 n = number;
362 return in;
363} /* operator >> */
364
365inline int operator != (const integer &n, const integer &m)
366{
367 return (!(n == m));
368} /* operator != */
369
370inline int operator == (const integer &n, int m)
371{
372 integer intm;
373 intm = m;
374 return (n == intm);
375} /* operator == */
376
377inline int operator != (const integer &n, int m)
378{
379 return !(n == m);
380} /* operator != */
381
382inline integer operator - (const integer &n, const integer &m)
383{
384 return (n + -m);
385} /* operator - */
386
387inline int integer::initialize (int n)
388{
389 p = prime_number (n);
390 return p;
391} /* integer::initialize */
392
393inline int integer::delta (void) const
394{
395 if (p)
396 return (num ? 1 : 0);
397 else
398 return ((num >= 0) ? num : -num);
399} /* integer::delta */
400
401inline integer integer::normalized (void) const
402{
403 integer n;
404 if (num < 0)
405 n. num = (numbertype) (-num);
406 else
407 n. num = num;
408 return n;
409} /* integer::normalized */
410
411inline bool operator < (const integer &x, const integer &y)
412{
413 return (x. num < y. num);
414} /* operator < */
415
416inline bool operator > (const integer &x, const integer &y)
417{
418 return (x. num > y. num);
419} /* operator > */
420
421
422} // namespace homology
423} // namespace chomp
424
425#endif // _CHOMP_STRUCT_INTEGER_H_
426
428
This class defines integer numbers with overflow control and with some specific properties of an Eucl...
Definition: integer.h:134
integer operator*(const integer &n) const
Definition: integer.h:337
friend std::ostream & operator<<(std::ostream &out, const integer &n)
Definition: integer.h:349
friend bool operator>(const integer &x, const integer &y)
Definition: integer.h:416
integer operator%(const integer &n) const
Definition: integer.h:264
static int prime_number(int n)
integer & operator+=(const integer &n)
Definition: integer.h:293
friend bool operator<(const integer &x, const integer &y)
Definition: integer.h:411
static const char * ringsymbol()
integer operator-() const
Definition: integer.h:274
int operator==(const integer &n) const
Definition: integer.h:344
static int cut_down(int n)
Definition: integer.h:194
static int is_prime(int n)
integer normalized() const
Definition: integer.h:401
static const char * ringname()
integer operator+(const integer &n) const
Definition: integer.h:330
integer & operator=(int n)
Definition: integer.h:241
integer & operator*=(const integer &n)
Definition: integer.h:306
static unsigned invert(unsigned n, unsigned q)
int delta(void) const
Definition: integer.h:393
integer operator/(const integer &n) const
Definition: integer.h:254
static int initialize(int n)
Definition: integer.h:387
This is a simple class which is a wrapper for computing the smallest prime number greater or equal to...
Definition: integer.h:60
int_t n
The actual prime number stored in this class.
Definition: integer.h:79
primeint & operator=(const primeint &p)
The assignment operator.
Definition: integer.h:90
primeint(int_t k=0)
The constructor which computes the smallest prime number greater than or equal to the given one.
This file contains some precompiler definitions which indicate the operating system and/or compiler u...
int int_t
Index type for indexing arrays, counting cubes, etc.
Definition: config.h:115
signed short numbertype
The type of number used to store the value of an object of type "integer".
Definition: integer.h:126
std::ostream & operator<<(std::ostream &out, const bincube< Dim, twoPower > &b)
Definition: bincube.h:907
integer operator-(const integer &n, const integer &m)
Definition: integer.h:382
bool operator<(const integer &x, const integer &y)
Definition: integer.h:411
bool operator!=(const typename bincube< Dim, twoPower >::neighborhood_iterator &x1, const typename bincube< Dim, twoPower >::neighborhood_iterator &x2)
Definition: bincube.h:794
std::istream & operator>>(std::istream &in, bincube< Dim, twoPower > &b)
Definition: bincube.h:914
bool operator==(const typename bincube< Dim, twoPower >::neighborhood_iterator &x1, const typename bincube< Dim, twoPower >::neighborhood_iterator &x2)
Definition: bincube.h:785
bool operator>(const integer &x, const integer &y)
Definition: integer.h:416
This namespace contains the entire CHomP library interface.
Definition: bitmaps.h:51
This file contains some useful functions related to the text input/output procedures.