50 lines
1.1 KiB
Plaintext
50 lines
1.1 KiB
Plaintext
#ifndef GFP_HEADER_CUH
|
|
#define GFP_HEADER_CUH
|
|
|
|
#include "../header.cuh"
|
|
|
|
namespace gfp
|
|
{
|
|
using gfp_t = uint32_t;
|
|
|
|
static const gfp_t gfprime = 65521;
|
|
|
|
static const gfp_t gfp_zero = (gfp_t)0;
|
|
static const gfp_t gfp_one = (gfp_t)1;
|
|
static const gfp_t gfp_fullmask = (gfp_t)0xFF'FF;
|
|
|
|
__managed__ gfp_t gfp_inv_table[gfprime];
|
|
|
|
void init_inv_table()
|
|
{
|
|
gfp_inv_table[0] = 0;
|
|
gfp_inv_table[1] = 1;
|
|
for (int i = 2; i < gfprime; ++i)
|
|
{
|
|
gfp_inv_table[i] = (gfprime - gfprime / i) * gfp_inv_table[gfprime % i] % gfprime;
|
|
}
|
|
}
|
|
gfp_t gfp_inv(gfp_t a)
|
|
{
|
|
return gfp_inv_table[a];
|
|
}
|
|
|
|
__host__ __device__ inline size_t offset4(size_t idx)
|
|
{
|
|
return idx << 2;
|
|
}
|
|
|
|
__host__ __device__ inline size_t get4(gfp_t src, size_t idx)
|
|
{
|
|
return (src >> offset4(idx)) & 0xF;
|
|
}
|
|
|
|
// 确保set8对应位置的值为0
|
|
__host__ __device__ inline void set4(gfp_t &dst, size_t src, size_t idx)
|
|
{
|
|
dst |= (gfp_t)src << offset4(idx);
|
|
}
|
|
|
|
}
|
|
|
|
#endif |