parent
d55a10e311
commit
b7148f7f3b
@ -0,0 +1,88 @@ |
|||||||
|
#pragma once |
||||||
|
/**
|
||||||
|
@file |
||||||
|
@brief definition of Unit and some functions |
||||||
|
@author MITSUNARI Shigeo(@herumi) |
||||||
|
@license modified new BSD license |
||||||
|
http://opensource.org/licenses/BSD-3-Clause
|
||||||
|
*/ |
||||||
|
#include <cybozu/inttype.hpp> |
||||||
|
#include <mcl/gmp_util.hpp> |
||||||
|
|
||||||
|
namespace mcl { namespace fp { |
||||||
|
|
||||||
|
#if defined(CYBOZU_OS_BIT) && (CYBOZU_OS_BIT == 32) |
||||||
|
typedef uint32_t Unit; |
||||||
|
#else |
||||||
|
typedef uint64_t Unit; |
||||||
|
#endif |
||||||
|
const size_t UnitBitN = sizeof(Unit) * 8; |
||||||
|
|
||||||
|
/*
|
||||||
|
get pp such that p * pp = -1 mod M, |
||||||
|
where p is prime and M = 1 << 64(or 32). |
||||||
|
@param pLow [in] p mod M |
||||||
|
*/ |
||||||
|
inline Unit getMontgomeryCoeff(Unit pLow) |
||||||
|
{ |
||||||
|
Unit ret = 0; |
||||||
|
Unit t = 0; |
||||||
|
Unit x = 1; |
||||||
|
for (size_t i = 0; i < UnitBitN; i++) { |
||||||
|
if ((t & 1) == 0) { |
||||||
|
t += pLow; |
||||||
|
ret += x; |
||||||
|
} |
||||||
|
t >>= 1; |
||||||
|
x <<= 1; |
||||||
|
} |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
inline int compareArray(const Unit* x, const Unit* y, size_t n) |
||||||
|
{ |
||||||
|
for (size_t i = n - 1; i != size_t(-1); i--) { |
||||||
|
if (x[i] < y[i]) return -1; |
||||||
|
if (x[i] > y[i]) return 1; |
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
inline bool isEqualArray(const Unit* x, const Unit* y, size_t n) |
||||||
|
{ |
||||||
|
for (size_t i = 0; i < n; i++) { |
||||||
|
if (x[i] != y[i]) return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
inline bool isZeroArray(const Unit *x, size_t n) |
||||||
|
{ |
||||||
|
for (size_t i = 0; i < n; i++) { |
||||||
|
if (x[i]) return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
inline void clearArray(Unit *x, size_t begin, size_t end) |
||||||
|
{ |
||||||
|
for (size_t i = begin; i < end; i++) x[i] = 0; |
||||||
|
} |
||||||
|
|
||||||
|
inline void copyArray(Unit *y, const Unit *x, size_t n) |
||||||
|
{ |
||||||
|
for (size_t i = 0; i < n; i++) y[i] = x[i]; |
||||||
|
} |
||||||
|
|
||||||
|
inline void toArray(Unit *y, size_t yn, const mpz_srcptr x) |
||||||
|
{ |
||||||
|
const int xn = x->_mp_size; |
||||||
|
assert(xn >= 0); |
||||||
|
const Unit* xp = (const Unit*)x->_mp_d; |
||||||
|
assert(xn <= (int)yn); |
||||||
|
copyArray(y, xp, xn); |
||||||
|
clearArray(y, xn, yn); |
||||||
|
} |
||||||
|
|
||||||
|
} } // mcl::fp
|
||||||
|
|
Loading…
Reference in new issue