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