⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vec_gf2.h

📁 密码大家Shoup写的数论算法c语言实现
💻 H
字号:
#ifndef NTL_vec_GF2__H#define NTL_vec_GF2__H#include <NTL/WordVector.h>#include <NTL/GF2.h>NTL_OPEN_NNSclass vec_GF2;class subscript_GF2 {public:   vec_GF2& v;   long i;   subscript_GF2(vec_GF2& vv, long ii) : v(vv), i(ii) { }   inline const subscript_GF2& operator=(const subscript_GF2&) const;   inline const subscript_GF2& operator=(GF2) const;   inline const subscript_GF2& operator=(long) const;   inline operator GF2() const;};class const_subscript_GF2 {public:   const vec_GF2& v;   long i;   const_subscript_GF2(const vec_GF2& vv, long ii) : v(vv), i(ii) { }   inline operator GF2() const;private:   void operator=(const const_subscript_GF2&); // disabled};   class vec_GF2 {public:// these should be private, but they are not   WordVector rep;   long _len;  // length (in bits)   long _maxlen;  // (MaxLength << 1) | (fixed)   // invariants: rep.length() "tracks" length() ( = _len)   //             All bits in positions >= length are zero.   // Note:       rep.MaxLength() may exceed the value   //             indicated by MaxLength().   //the following are "really" public   vec_GF2() : _len(0), _maxlen(0) {}   vec_GF2(INIT_SIZE_TYPE, long n) : _len(0), _maxlen(0) { SetLength(n); }   vec_GF2(const vec_GF2& a) : _len(0), _maxlen(0) { *this = a; }   vec_GF2& operator=(const vec_GF2& a);   ~vec_GF2() {}   void kill();   void SetLength(long n);   void SetMaxLength(long n);   void FixLength(long n);   long length() const { return _len; }   long MaxLength() const { return _maxlen >> 1; }     long fixed() const { return _maxlen & 1; }   vec_GF2(vec_GF2& x, INIT_TRANS_TYPE) :       rep(x.rep, INIT_TRANS), _len(x._len), _maxlen(x._maxlen) { }   GF2 get(long i) const;   void put(long i, GF2 a);   void put(long i, long a) { put(i, to_GF2(a)); }   subscript_GF2 operator[](long i)       { return subscript_GF2(*this, i); }   subscript_GF2 operator()(long i)       { return subscript_GF2(*this, i-1); }   const_subscript_GF2 operator[](long i) const       { return const_subscript_GF2(*this, i); }   const_subscript_GF2 operator()(long i) const       { return const_subscript_GF2(*this, i-1); }};inline subscript_GF2::operator GF2() const{   return v.get(i);}inline const_subscript_GF2::operator GF2() const{   return v.get(i);}inline const subscript_GF2&    subscript_GF2::operator=(const subscript_GF2& a) const   { v.put(i, a.v.get(a.i));  return *this; }inline const subscript_GF2&    subscript_GF2::operator=(GF2 a) const   { v.put(i, a);  return *this; }inline const subscript_GF2&    subscript_GF2::operator=(long a) const   { v.put(i, a);  return *this; }inline const subscript_GF2& operator+=(const subscript_GF2& x, GF2 b)   { x = x + b; return x; }  inline const subscript_GF2& operator+=(const subscript_GF2& x, long b)   { x = x + b; return x; }  inline const subscript_GF2& operator-=(const subscript_GF2& x, GF2 b)   { x = x - b; return x; }  inline const subscript_GF2& operator-=(const subscript_GF2& x, long b)   { x = x - b; return x; }  inline const subscript_GF2& operator*=(const subscript_GF2& x, GF2 b)   { x = x * b; return x; }  inline const subscript_GF2& operator*=(const subscript_GF2& x, long b)   { x = x * b; return x; }  inline const subscript_GF2& operator/=(const subscript_GF2& x, GF2 b)   { x = x / b; return x; }  inline const subscript_GF2& operator/=(const subscript_GF2& x, long b)   { x = x / b; return x; }  inline const subscript_GF2& operator++(const subscript_GF2& x)    { x = x + 1; return x; }inline void operator++(const subscript_GF2& x, int)    { x = x + 1; }inline const subscript_GF2& operator--(const subscript_GF2& x)    { x = x - 1; return x; }inline void operator--(const subscript_GF2& x, int)    { x = x - 1; }void swap(vec_GF2& x, vec_GF2& y);void append(vec_GF2& v, GF2 a);void append(vec_GF2& v, const vec_GF2& a);long operator==(const vec_GF2& a, const vec_GF2& b);inline long operator!=(const vec_GF2& a, const vec_GF2& b)   { return !(a == b); }NTL_SNS ostream& operator<<(NTL_SNS ostream& s, const vec_GF2& a);NTL_SNS istream& operator>>(NTL_SNS istream& s, vec_GF2& a);void shift(vec_GF2& x, const vec_GF2& a, long n);// x = a shifted n places, i.e., if l = a.length(),//    x.length() = l, x[i] = a[i-n] for 0 <= i-n < l,//    and x[i] = 0 for all other i such that 0 <= i < l.inline vec_GF2 shift(const vec_GF2& a, long n)   { vec_GF2 x; shift(x, a, n); NTL_OPT_RETURN(vec_GF2, x); }void reverse(vec_GF2& x, const vec_GF2& a);inline vec_GF2 reverse(const vec_GF2& a)   { vec_GF2 x; reverse(x, a); NTL_OPT_RETURN(vec_GF2, x); }void random(vec_GF2& x, long n);inline vec_GF2 random_vec_GF2(long n)   { vec_GF2 x; random(x, n); NTL_OPT_RETURN(vec_GF2, x); }long weight(const vec_GF2& a);void mul(vec_GF2& x, const vec_GF2& a, GF2 b);inline void mul(vec_GF2& x, GF2 a, const vec_GF2& b)   { mul(x, b, a); }inline void mul(vec_GF2& x, const vec_GF2& a, long b)   { mul(x, a, to_GF2(b)); }inline void mul(vec_GF2& x, long a, const vec_GF2& b)   { mul(x, b, a); }void add(vec_GF2& x, const vec_GF2& a, const vec_GF2& b);inline void sub(vec_GF2& x, const vec_GF2& a, const vec_GF2& b)   { add(x, a, b); }void clear(vec_GF2& x);inline void negate(vec_GF2& x, const vec_GF2& a)   { x = a; }inline void InnerProduct(GF2& x, const vec_GF2& a, const vec_GF2& b)   { x = to_GF2(InnerProduct(a.rep, b.rep)); }long IsZero(const vec_GF2& a);vec_GF2 operator+(const vec_GF2& a, const vec_GF2& b);vec_GF2 operator-(const vec_GF2& a, const vec_GF2& b);inline vec_GF2 operator-(const vec_GF2& a)   { return a; }inline vec_GF2 operator*(const vec_GF2& a, GF2 b)   { vec_GF2 x; mul(x, a, b); NTL_OPT_RETURN(vec_GF2, x); }inline vec_GF2 operator*(const vec_GF2& a, long b)   { vec_GF2 x; mul(x, a, b); NTL_OPT_RETURN(vec_GF2, x); }inline vec_GF2 operator*(GF2 a, const vec_GF2& b)   { vec_GF2 x; mul(x, a, b); NTL_OPT_RETURN(vec_GF2, x); }inline vec_GF2 operator*(long a, const vec_GF2& b)   { vec_GF2 x; mul(x, a, b); NTL_OPT_RETURN(vec_GF2, x); }inline GF2 operator*(const vec_GF2& a, const vec_GF2& b)   { return to_GF2(InnerProduct(a.rep, b.rep)); }// assignment operator notation:inline vec_GF2& operator+=(vec_GF2& x, const vec_GF2& a){    add(x, x, a);   return x;}inline vec_GF2& operator-=(vec_GF2& x, const vec_GF2& a){    sub(x, x, a);   return x;}inline vec_GF2& operator*=(vec_GF2& x, GF2 a){    mul(x, x, a);   return x;}inline vec_GF2& operator*=(vec_GF2& x, long a){    mul(x, x, a);   return x;}void VectorCopy(vec_GF2& x, const vec_GF2& a, long n);inline vec_GF2 VectorCopy(const vec_GF2& a, long n)   { vec_GF2 x; VectorCopy(x, a, n); NTL_OPT_RETURN(vec_GF2, x); }NTL_CLOSE_NNS#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -