-
Notifications
You must be signed in to change notification settings - Fork 1
/
IPSTDRAN.c,v
74 lines (60 loc) · 1.28 KB
/
IPSTDRAN.c,v
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
head 1.1;
access;
symbols;
locks
saclib:1.1; strict;
comment @ * @;
1.1
date 96.03.26.12.30.31; author George; state new;
branches;
next ;
desc
@Integral polynomial, specified total degree, random.
@
1.1
log
@Initial revision
@
text
@/*====================================================================
A <- IPSTDRAN(r,k,q,n)
Integral polynomial, specified total degree, random.
Inputs
r : BETA-digit r >= 0.
k : a positive BETA-digit.
q : in Q, q = q1 / q2 with 0 < q1 <= q2 < BETA.
n : a non-negative BETA-digit.
Output
A : in Z[x_1,...,x_r], a random integral polynomial in r
variables of total degree <= n and target density of
q, with random k-bit coefficients.
=====================================================================*/
#include "saclib.h"
Word IPSTDRAN(r,k,q,n)
Word r,k,q,n;
{
Word A,A1,d,i,q1,q2,qs,t;
Step1: /* Approximate q * BETA. */
FIRST2(q,&q1,&q2);
DQR(q1,0,q2,&qs,&t);
Step2: /* r = 0. */
if (r > 0)
goto Step3;
d = DRANN();
if (d < qs)
A = IRAND(k);
else
A = 0;
goto Return;
Step3: /* r >= 1. */
A = NIL;
for (i = 0; i <= n; i++) {
A1 = IPSTDRAN(r - 1,k,q,n - i);
if (A1 != 0)
A = COMP2(i,A1,A); }
if (A == NIL)
A = 0;
Return: /* Return A. */
return(A);
}
@