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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
#include "points.h"
void
init_points(void) /* void */
{
pari_sp ltop = avma;
avma = ltop;
return;
}
/* Finds random point of order n on curve e of order o.
* @returns [[P.x, P.y], n, h]
* @param e curve
* @param o curve order
* @param n desired point order
*/
GEN
find_point(GEN e, GEN o, GEN n) /* vec */
{
pari_sp ltop = avma;
GEN h = gen_0, P = gen_0;
GEN p1 = gen_0; /* vec */
h = gdivent(o, n);
{
pari_sp btop = avma;
do
{
P = genrand(e);
if (gc_needed(btop, 1))
P = gerepilecopy(btop, P);
} while(gequal0(ellmul(e, P, n)));
}
p1 = cgetg(4, t_VEC);
gel(p1, 1) = gcopy(P);
gel(p1, 2) = gcopy(n);
gel(p1, 3) = gcopy(h);
p1 = gerepilecopy(ltop, p1);
return p1;
}
/* Finds random points of orders given by vector p.
* @returns vector of points in format [[P.x, P.y], n, h]
* @param e curve
* @param o curve order
* @param p vector of point orders
*/
GEN
find_points(GEN e, GEN o, GEN p) /* vec */
{
pari_sp ltop = avma;
long l1;
GEN p2 = gen_0; /* vec */
l1 = glength(p);
{
long X;
p2 = cgetg(l1+1, t_VEC);
for (X = 1; X <= l1; ++X)
gel(p2, X) = find_point(e, o, gel(p, X));
}
p2 = gerepilecopy(ltop, p2);
return p2;
}
/*####################################################################*/
GEN
maxprime_order(GEN e, GEN o)
{
pari_sp ltop = avma;
if (!gequal0(gisprime(o, 0)))
{
o = gerepilecopy(ltop, o);
return o;
}
else
{
GEN p1 = gen_0;
p1 = vecmax(factor(o));
p1 = gerepilecopy(ltop, p1);
return p1;
}
avma = ltop;
return gen_0;
}
GEN
minprime_order(GEN e, GEN o)
{
pari_sp ltop = avma;
if (!gequal0(gisprime(o, 0)))
{
o = gerepilecopy(ltop, o);
return o;
}
else
{
GEN p1 = gen_0;
p1 = gcopy(gcoeff(factor(o), 1, 1));
p1 = gerepilecopy(ltop, p1);
return p1;
}
avma = ltop;
return gen_0;
}
GEN
max_order(GEN e, GEN o)
{
pari_sp ltop = avma;
o = gerepilecopy(ltop, o);
return o;
}
/* Finds a random point of order given by f(o).
* @returns [[P.x, P.y], n, h]
* with P being the point with order f(o).
* @param e curve
* @param o curve order
* @param f function returning the point order, \in maxprime_order,
* minprime_order, max_order
*/
GEN
get_point(GEN e, GEN o, GEN f) /* vec */
{
pari_sp ltop = avma;
GEN p1 = gen_0; /* vec */
p1 = find_point(e, o, closure_callgen1(f, o));
p1 = gerepilecopy(ltop, p1);
return p1;
}
/*####################################################################*/
GEN
prime_orders(GEN e, GEN o)
{
pari_sp ltop = avma;
GEN f = gen_0;
if (!gequal0(gisprime(o, 0)))
{
GEN p1 = gen_0; /* vec */
p1 = cgetg(2, t_VEC);
gel(p1, 1) = gcopy(o);
p1 = gerepilecopy(ltop, p1);
return p1;
}
else
{
long l2;
GEN p3 = gen_0; /* vec */
f = factor(o);
l2 = glength(f);
{
long X;
p3 = cgetg(l2+1, t_VEC);
for (X = 1; X <= l2; ++X)
gel(p3, X) = gcopy(gcoeff(f, X, 1));
}
p3 = gerepilecopy(ltop, p3);
return p3;
}
avma = ltop;
return gen_0;
}
/* Finds random points of orders given by f(o).
* @returns vector of points in format [[P.x, P.y], n, h]
* @param e curve
* @param o curve order
* @param f function returning a vector of point orders
*/
GEN
get_points(GEN e, GEN o, GEN f) /* vec */
{
pari_sp ltop = avma;
GEN p1 = gen_0; /* vec */
p1 = find_points(e, o, closure_callgen1(f, o));
p1 = gerepilecopy(ltop, p1);
return p1;
}
|