1 // ========================================================================== 2 // $Source: /var/lib/cvs/Givaro/src/kernel/gmp++/gmp++_int_mul.C,v $ 3 // Copyright(c)'1994-2009 by The Givaro group 4 // This file is part of Givaro. 5 // Givaro is governed by the CeCILL-B license under French law 6 // and abiding by the rules of distribution of free software. 7 // see the COPYRIGHT file for more details. 8 // Authors: M. Samama, T. Gautier 9 // $Id: gmp++_int_mul.C,v 1.11 2011-01-20 08:19:15 jgdumas Exp $ 10 // ========================================================================== 11 /** @file gmp++/gmp++_int_mul.C 12 * muling stuff. 13 */ 14 15 #ifndef __GIVARO_gmpxx_gmpxx_int_mul_C 16 #define __GIVARO_gmpxx_gmpxx_int_mul_C 17 18 #ifndef __GIVARO_INLINE_ALL 19 #include "gmp++/gmp++.h" 20 #endif 21 22 namespace Givaro { 23 24 //-------------------------------------------------- operator * mulin(Integer & res,const Integer & n)25 Integer& Integer::mulin(Integer& res, const Integer& n) 26 { 27 if (isZero(n)) return res = Integer::zero; 28 if (isZero(res)) return res; 29 mpz_mul( (mpz_ptr)&res.gmp_rep, (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&n.gmp_rep ); 30 return res; 31 } mulin(Integer & res,const int64_t n)32 Integer& Integer::mulin(Integer& res, const int64_t n) 33 { 34 if (isZero(n)) return res = Integer::zero; 35 if (isZero(res)) return res; 36 // int32_t sgn = sign(n); 37 // int32_t sgn = sign(n); 38 // mpz_mul_ui( (mpz_ptr)&res.gmp_rep, (mpz_ptr)&res.gmp_rep, abs(n)); 39 // if (sgn <0) res.gmp_rep.size = -res.gmp_rep.size; 40 // if (sgn <0) return res = -res; 41 mpz_mul_si( (mpz_ptr)&res.gmp_rep, (mpz_ptr)&res.gmp_rep, n); 42 return res; 43 } mulin(Integer & res,const uint64_t n)44 Integer& Integer::mulin(Integer& res, const uint64_t n) 45 { 46 if (isZero(n)) return res = Integer::zero; 47 if (isZero(res)) return res; 48 mpz_mul_ui( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&res.gmp_rep, n); 49 return res; 50 } 51 mul(Integer & res,const Integer & n1,const Integer & n2)52 Integer& Integer::mul(Integer& res, const Integer& n1, const Integer& n2) 53 { 54 if (isZero(n1)) return res = Integer::zero; 55 if (isZero(n2)) return res = Integer::zero; 56 mpz_mul( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&n1.gmp_rep, (mpz_srcptr)&n2.gmp_rep); 57 return res; 58 } mul(Integer & res,const Integer & n1,const int64_t n2)59 Integer& Integer::mul(Integer& res, const Integer& n1, const int64_t n2) 60 { 61 if (isZero(n1)) return res = Integer::zero; 62 if (isZero(n2)) return res = Integer::zero; 63 // int32_t sgn = sign(n2); 64 // mpz_mul_ui( (mpz_ptr)&res.gmp_rep, (mpz_ptr)&n1.gmp_rep, abs(n2)); 65 // if (sgn <0) res.gmp_rep.size = -res.gmp_rep.size; 66 // if (sgn <0) return res = -res; 67 mpz_mul_si( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&n1.gmp_rep, n2); 68 return res; 69 } mul(Integer & res,const Integer & n1,const uint64_t n2)70 Integer& Integer::mul(Integer& res, const Integer& n1, const uint64_t n2) 71 { 72 if (isZero(n1)) return res = Integer::zero; 73 if (isZero(n2)) return res = Integer::zero; 74 mpz_mul_ui( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&n1.gmp_rep, n2); 75 return res; 76 } 77 axpy(Integer & res,const Integer & a,const Integer & x,const Integer & b)78 Integer& Integer::axpy(Integer& res, const Integer& a, const Integer& x, const Integer& b) 79 { 80 if (&res == &b) return Integer::axpyin(res,a,x); 81 if (isZero(a) || isZero(x)) return res = b; 82 mpz_mul( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, (mpz_srcptr)&x.gmp_rep); 83 mpz_add( (mpz_ptr)&res.gmp_rep, (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&b.gmp_rep); 84 return res; 85 } 86 axpy(Integer & res,const Integer & a,const uint64_t x,const Integer & b)87 Integer& Integer::axpy(Integer& res, const Integer& a, const uint64_t x, const Integer& b) 88 { 89 if (&res == &b) return Integer::axpyin(res,a,x); 90 if (isZero(a) || isZero(x)) return res = b; 91 mpz_mul_ui( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, x); 92 mpz_add( (mpz_ptr)&res.gmp_rep, (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&b.gmp_rep); 93 return res; 94 } 95 96 axpyin(Integer & res,const Integer & a,const Integer & x)97 Integer& Integer::axpyin(Integer& res, const Integer& a, const Integer& x) 98 { 99 if (isZero(a) || isZero(x)) return res; 100 mpz_addmul( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, (mpz_srcptr)&x.gmp_rep); 101 return res; 102 } 103 axpyin(Integer & res,const Integer & a,const uint64_t x)104 Integer& Integer::axpyin(Integer& res, const Integer& a, const uint64_t x) 105 { 106 if (isZero(a) || isZero(x)) return res; 107 mpz_addmul_ui( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, x); 108 return res; 109 } 110 111 maxpy(Integer & res,const Integer & a,const Integer & x,const Integer & b)112 Integer& Integer::maxpy(Integer& res, const Integer& a, const Integer& x, const Integer& b) 113 { 114 if (isZero(a) || isZero(x)) return res=b; 115 if (&res == &b) return Integer::maxpyin(res,a,x); 116 mpz_mul( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, (mpz_srcptr)&x.gmp_rep); 117 mpz_sub( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&b.gmp_rep, (mpz_ptr)&res.gmp_rep); 118 return res; 119 } maxpy(Integer & res,const Integer & a,const uint64_t x,const Integer & b)120 Integer& Integer::maxpy(Integer& res, const Integer& a, const uint64_t x, const Integer& b) 121 { 122 if (isZero(a) || isZero(x)) return res=b; 123 if (&res == &b) return Integer::maxpyin(res,a,x); 124 mpz_mul_ui( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, x); 125 mpz_sub( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&b.gmp_rep, (mpz_ptr)&res.gmp_rep); 126 return res; 127 } 128 axmy(Integer & res,const Integer & a,const Integer & x,const Integer & b)129 Integer& Integer::axmy(Integer& res, const Integer& a, const Integer& x, const Integer& b) 130 { 131 if (&res == &b) return Integer::axmyin(res,a,x); 132 if (isZero(a) || isZero(x)) return Integer::neg(res,b); 133 mpz_mul( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, (mpz_srcptr)&x.gmp_rep); 134 mpz_sub( (mpz_ptr)&res.gmp_rep, (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&b.gmp_rep); 135 return res; 136 } 137 axmy(Integer & res,const Integer & a,const uint64_t x,const Integer & b)138 Integer& Integer::axmy(Integer& res, const Integer& a, const uint64_t x, const Integer& b) 139 { 140 if (&res == &b) return Integer::axmyin(res,a,x); 141 if (isZero(a) || isZero(x)) return Integer::neg(res,b); 142 mpz_mul_ui( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, x); 143 mpz_sub( (mpz_ptr)&res.gmp_rep, (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&b.gmp_rep); 144 return res; 145 } 146 axmyin(Integer & res,const Integer & a,const Integer & x)147 Integer& Integer::axmyin(Integer& res, const Integer& a, const Integer& x) 148 { 149 Integer::maxpyin(res,a,x); 150 Integer::negin(res); 151 return res ; 152 } 153 axmyin(Integer & res,const Integer & a,const uint64_t x)154 Integer& Integer::axmyin(Integer& res, const Integer& a, const uint64_t x) 155 { 156 Integer::maxpyin(res,a,x); 157 Integer::negin(res); 158 return res ; 159 } 160 maxpyin(Integer & res,const Integer & a,const Integer & x)161 Integer& Integer::maxpyin(Integer& res, const Integer& a, const Integer& x) 162 { 163 if (isZero(a) || isZero(x)) return res; 164 mpz_submul( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, (mpz_srcptr)&x.gmp_rep); 165 return res; 166 } 167 maxpyin(Integer & res,const Integer & a,const uint64_t x)168 Integer& Integer::maxpyin(Integer& res, const Integer& a, const uint64_t x) 169 { 170 if (isZero(a) || isZero(x)) return res; 171 mpz_submul_ui( (mpz_ptr)&res.gmp_rep, (mpz_srcptr)&a.gmp_rep, x); 172 return res; 173 } 174 175 Integer& Integer::operator *= (const Integer& n) 176 { 177 if (isZero(n)) return *this = Integer::zero; 178 if (isZero(*this)) return *this; 179 // Rep (res.gmp_rep)( MAX(SZ_REP(n.gmp_rep),SZ_REP(gmp_rep)) ); 180 Integer res; 181 mpz_mul( (mpz_ptr)&(res.gmp_rep), (mpz_ptr)&gmp_rep, (mpz_srcptr)&n.gmp_rep) ; 182 return *this = res; 183 } 184 185 Integer& Integer::operator *= (const uint64_t l) 186 { 187 if (l==0) return *this = Integer::zero; 188 if (isZero(*this)) return *this; 189 // Rep (res.gmp_rep)( MAX(SZ_REP(gmp_rep),1) ); 190 mpz_mul_ui( (mpz_ptr)&(gmp_rep), (mpz_ptr)&gmp_rep, l); 191 return *this; 192 } 193 194 Integer& Integer::operator *= (const int64_t l) 195 { 196 if (l==0) return *this =Integer::zero; 197 if (isZero(*this)) return *this; 198 // Rep (res.gmp_rep)( MAX(SZ_REP(gmp_rep),1) ); 199 // int32_t sgn = sign(l); 200 // mpz_mul_ui( (mpz_ptr)&(gmp_rep), (mpz_ptr)&gmp_rep, abs(l)); 201 // if (sgn <0) mpz_neg( (mpz_ptr)&gmp_rep, (mpz_ptr)&(gmp_rep) ); 202 mpz_mul_si( (mpz_ptr)&(gmp_rep), (mpz_ptr)&gmp_rep, l); 203 return *this; 204 } 205 206 207 Integer Integer::operator * (const Integer& n) const 208 { 209 if (isZero(n)) return Integer::zero; 210 if (isZero(*this)) return Integer::zero; 211 // Rep (res.gmp_rep)( MAX(SZ_REP(n.gmp_rep),SZ_REP(gmp_rep)) ); 212 Integer res; 213 mpz_mul( (mpz_ptr)&(res.gmp_rep), (mpz_srcptr)&gmp_rep, (mpz_srcptr)&n.gmp_rep) ; 214 return res; 215 } 216 217 Integer Integer::operator * (const uint64_t l) const 218 { 219 if (l==0) return Integer::zero; 220 if (isZero(*this)) return Integer::zero; 221 // Rep (res.gmp_rep)( MAX(SZ_REP(gmp_rep),1) ); 222 Integer res; 223 mpz_mul_ui( (mpz_ptr)&(res.gmp_rep), (mpz_srcptr)&gmp_rep, l); 224 return res; 225 } 226 227 Integer Integer::operator * (const int64_t l) const 228 { 229 if (l==0) return Integer::zero; 230 if (isZero(*this)) return Integer::zero; 231 // Rep (res.gmp_rep)( MAX(SZ_REP(gmp_rep),1) ); 232 Integer res; 233 // int32_t sgn = sign(l); 234 // mpz_mul_ui( (mpz_ptr)&(res.gmp_rep), (mpz_ptr)&gmp_rep, abs(l)); 235 // if (sgn <0) (res.gmp_rep).size = -(res.gmp_rep).size; 236 // return Integer((res.gmp_rep)); 237 // if (sgn <0) mpz_neg( (mpz_ptr)&(res.gmp_rep), (mpz_ptr)&(res.gmp_rep) ); 238 mpz_mul_si( (mpz_ptr)&(res.gmp_rep), (mpz_srcptr)&gmp_rep, l); 239 return res; 240 } 241 242 // -- operator * 243 Integer operator * (const int32_t l, const Integer& n) 244 { 245 return n * (int64_t)l; 246 } 247 Integer operator * (const uint32_t l, const Integer& n) 248 { 249 return n * (uint64_t)l; 250 } 251 Integer operator * (const int64_t l, const Integer& n) 252 { 253 return n * l; 254 } 255 Integer operator * (const uint64_t l, const Integer& n) 256 { 257 return n * l; 258 } 259 260 261 262 } 263 #endif // __GIVARO_gmpxx_gmpxx_int_mul_C 264 /* -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 265 // vim:sts=4:sw=4:ts=4:et:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s 266