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