#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