-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCurveArithmetic.hpp
133 lines (104 loc) · 3.56 KB
/
CurveArithmetic.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
* CurveArithmetic.hpp
*
* Created on: 09.09.2011
* Author: ulysses
*/
#ifndef CURVEARITHMETIC_HPP_
#define CURVEARITHMETIC_HPP_
#include <array>
#include <algorithm>
#include <functional>
#include <iterator>
#include <vector>
#include <iostream>
#include "Point.hpp"
namespace mv_poly {
// template alias for collection of basis elements in weighted order
template<int N, int a, int b>
using WeightedBasisCollection = std::vector< Point<N, WeightedOrder<a, b>::template impl > >;
template<int r>
WeightedBasisCollection<2, r, r+1>
getHermitianCodeBasis(int l) {
typedef typename WeightedBasisCollection<2, r, r+1>::value_type Pt;
WeightedBasisCollection<2, r, r+1> result;
result.reserve(l);
Pt p;
std::generate_n(
std::back_inserter(result), l,
[&p]() { return p++; });
return result;
}
template<typename FieldElem, typename CurvePoint>
bool isPlainHermitianCurveRationalPoint(int r, CurvePoint cp) {
// Hermitian curve equation --v
return FieldElemTraits<FieldElem>::power(cp[0], r + 1) -
FieldElemTraits<FieldElem>::power(cp[1], r) - cp[1] ==
FieldElemTraits<FieldElem>::addId();
// TODO: repetitive computations of x^n are ineffective
}
template<int r, typename CurvePoint, typename FieldElem>
std::vector<CurvePoint>
getPlainHermitianCurveRationalPoints() {
// auto power = &FieldElemTraits<FieldElem>::power;
FieldElem x = FieldElemTraits<FieldElem>::getPrimitive();
std::vector<CurvePoint> result;
FieldElem zero = FieldElemTraits<FieldElem>::addId();
FieldElem id = FieldElemTraits<FieldElem>::multId();
CurvePoint cp;
cp[0] = zero;
cp[1] = zero;
result.push_back(cp);
cp[0] = zero;
cp[1] = id;
do {
if (isPlainHermitianCurveRationalPoint<FieldElem>(r, cp)) {
result.push_back(cp);
}
cp[1] *= x;
} while (cp[1] != id);
cp[0] = id;
do {
cp[1] = id;
do {
if (isPlainHermitianCurveRationalPoint<FieldElem>(r, cp)) {
result.push_back(cp);
}
cp[1] *= x;
} while (cp[1] != id);
cp[0] *= x;
} while (cp[0] != id);
return result;
}
/**
* Computes p^m ( = p_1^m_1 * p_2^m_2 * ... * p_n^m_n).
*/
template<typename FieldElem, typename Monom, typename CurvePoint>
FieldElem computeMonomAtPoint(Monom const & m, CurvePoint const & p) {
return std::inner_product(p.begin(), p.end(), m.begin(),
FieldElemTraits<FieldElem>::multId(),
std::multiplies<FieldElem>(),
FieldElemTraits<FieldElem>::template power<typename Monom::value_type>);
}
template<int r, typename FieldElem>
struct HermitianCodeParams {
enum {DIM = 2}; // Hermitian curve is a plain curve
typedef FieldElem Field; // NOTE: Hermitian curve is defined over F_{q^2}
typedef WeightedOrder<r, r + 1> OrderPolicyHolder;
typedef WeightedBasisCollection<DIM, r, r+1> BasisCollection;
typedef typename BasisCollection::value_type BasisElem;
typedef std::array<FieldElem, DIM> CurvePoint;
typedef decltype(getPlainHermitianCurveRationalPoints<r,
CurvePoint, FieldElem>()) CurvePointsCollection;
// template<typename CurvePoint, typename FieldElem>
static BasisCollection getCodeBasis(int l) {
return getHermitianCodeBasis<r>(l);
}
static
CurvePointsCollection
getRationalPoints() {
return getPlainHermitianCurveRationalPoints<r, CurvePoint, FieldElem>();
}
};
} // namespace mv_poly
#endif /* CURVEARITHMETIC_HPP_ */