-rw-r--r-- 1543 high-ctidh-20210504/uintbig.h
#ifndef uintbig_h #define uintbig_h #include "uintbig_namespace.h" #include <stdbool.h> #include <stdint.h> #define UINTBIG_LIMBS ((BITS+63)/64) typedef struct uintbig { uint64_t c[UINTBIG_LIMBS]; } uintbig; extern const uintbig uintbig_p; extern const uintbig uintbig_1; extern const uintbig uintbig_four_sqrt_p; void uintbig_set(uintbig *x, uint64_t y); long long uintbig_bit(uintbig const *x, uint64_t k); long long uintbig_add3(uintbig *x, uintbig const *y, uintbig const *z); /* returns carry */ long long uintbig_sub3(uintbig *x, uintbig const *y, uintbig const *z); /* returns borrow */ void uintbig_mul3_64(uintbig *x, uintbig const *y, uint64_t z); static inline long long uintbig_bits_vartime(const uintbig *x) { long long result = BITS; while (result > 0 && !uintbig_bit(x,result-1)) --result; return result; } static inline long long uintbig_uint64_iszero(uint64_t t) { // is t nonzero? t |= t>>32; // are bottom 32 bits of t nonzero? t &= 0xffffffff; // is t nonzero? between 0 and 0xffffffff t = -t; // is t nonzero? 0, or between 2^64-0xffffffff and 2^64-1 t >>= 63; return 1-(long long) t; } static inline long long uintbig_iszero(const uintbig *x) { uint64_t t = 0; for (long long i = 0;i < UINTBIG_LIMBS;++i) t |= x->c[i]; return uintbig_uint64_iszero(t); } static inline long long uintbig_isequal(const uintbig *x,const uintbig *y) { uint64_t t = 0; for (long long i = 0;i < UINTBIG_LIMBS;++i) t |= (x->c[i])^(y->c[i]); return uintbig_uint64_iszero(t); } #endif