1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
/*
* Normaliz 2.7
* Copyright (C) 2007-2011 Winfried Bruns, Bogdan Ichim, Christof Soeger
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef INTEGER_H_
#define INTEGER_H_
#include "libnormaliz.h"
// Integer should (may) support:
// Integer abs(Integer); here implemented as Iabs
// Integer min(Integer, Integer); here we use the template min in <algorithm>
// It provides abs, gcd and lcm
//---------------------------------------------------------------------------
namespace libnormaliz {
//---------------------------------------------------------------------------
template<typename Integer> inline long explicit_cast_to_long(const Integer& a) {
return (long)a;
}
template<> inline long explicit_cast_to_long<mpz_class> (const mpz_class& a) {
return a.get_si();
}
//---------------------------------------------------------------------------
// Basic functions
//---------------------------------------------------------------------------
// returns the absolute value of a
template<typename Integer> inline Integer Iabs(const Integer& a) {
return (a>=0) ? (a) : Integer(-a);
}
//returns gcd of a and b, if one is 0 returns the nonzero one
template<typename Integer> Integer gcd(const Integer& a, const Integer& b);
template<> mpz_class gcd<mpz_class>(const mpz_class& a, const mpz_class& b);
//returns lcm of a and b, returns 0 if one is 0
template<typename Integer> Integer lcm(const Integer& a, const Integer& b);
template<> mpz_class lcm(const mpz_class& a, const mpz_class& b);
//---------------------------------------------------------------------------
// Special functions
//---------------------------------------------------------------------------
//return the number of decimals, needed to write the Integer a
template<typename Integer> size_t decimal_length(Integer a);
//returns b!/a!
template<typename Integer> Integer permutations(const size_t& a, const size_t& b);
template<typename Integer> Integer permutations_modulo(const size_t& a, const size_t& b, long m);
}
//---------------------------------------------------------------------------
#endif /* INTEGER_H_ */
//---------------------------------------------------------------------------
|