parent
c1bcf317a1
commit
8d64a0cfed
@ -0,0 +1,67 @@ |
||||
#pragma once |
||||
/**
|
||||
@file |
||||
@author MITSUNARI Shigeo(@herumi) |
||||
@license modified new BSD license |
||||
http://opensource.org/licenses/BSD-3-Clause
|
||||
*/ |
||||
#include <stdint.h> |
||||
#include <stdlib.h> |
||||
|
||||
// for 32bit not full version
|
||||
|
||||
namespace mcl { |
||||
|
||||
template<size_t N> |
||||
void copyT(uint32_t *y, const uint32_t *x) |
||||
{ |
||||
for (size_t i = 0; i < N; i++) { |
||||
y[i] = x[i]; |
||||
} |
||||
} |
||||
|
||||
template<size_t N> |
||||
void addT(uint32_t *z, const uint32_t *x, const uint32_t *y) |
||||
{ |
||||
bool c = false; |
||||
for (size_t i = 0; i < N; i++) { |
||||
uint64_t v = uint64_t(x[i]) + y[i] + c; |
||||
z[i] = uint32_t(v); |
||||
c = (v >> 32) != 0; |
||||
} |
||||
} |
||||
|
||||
template<size_t N> |
||||
bool subT(uint32_t *z, const uint32_t *x, const uint32_t *y) |
||||
{ |
||||
bool c = false; |
||||
for (size_t i = 0; i < N; i++) { |
||||
uint64_t v = uint64_t(x[i]) - y[i] - c; |
||||
z[i] = uint32_t(v); |
||||
c = (v >> 32) != 0; |
||||
} |
||||
return c; |
||||
} |
||||
|
||||
template<size_t N> |
||||
void addModT(uint32_t *z, const uint32_t *x, const uint32_t *y, const uint32_t *p) |
||||
{ |
||||
uint32_t t[N]; |
||||
addT<N>(z, x, y); |
||||
bool c = subT<N>(t, z, p); |
||||
if (!c) { |
||||
copyT<N>(z, t); |
||||
} |
||||
} |
||||
|
||||
template<size_t N> |
||||
void subModT(uint32_t *z, const uint32_t *x, const uint32_t *y, const uint32_t *p) |
||||
{ |
||||
bool c = subT<N>(z, x, y); |
||||
if (c) { |
||||
addT<N>(z, z, p); |
||||
} |
||||
} |
||||
|
||||
} // mcl
|
||||
|
Loading…
Reference in new issue