66 lines
2.5 KiB
Plaintext
66 lines
2.5 KiB
Plaintext
|
|
One of the basic design "features" of MIRACL is that all big number types are
|
|
of the same size, defined either at run time, or at compile time.
|
|
|
|
This means that all big types are of the same size, and in the vast majority
|
|
of cases this is just fine, and very efficient.
|
|
|
|
However there are some situations where, while most of the variable should be
|
|
of size n bits, some are naturally required to be of size 2*n bits. One
|
|
way around this is to make all big variables 2*n in size, but this can
|
|
be wastful of space.
|
|
|
|
Consider for example Elliptic curves over a quadratic extension, as suggested
|
|
by Galbraith, Lin and Scott, and as supported by functions in the module
|
|
mrecn2.c
|
|
|
|
While all of the field variables are of a size n, the group size is of size
|
|
2*n. In this case it makes sense for the vast majority of operations on field
|
|
elements, to be on elements of size n, while allowing the much simpler group
|
|
operations to be on variables of size 2*n.
|
|
|
|
Here is how to do it (for C programs only).
|
|
|
|
(1) Assign space for big variables from a block of memory
|
|
|
|
#ifndef MR_STATIC
|
|
char *mem = memalloc(_MIPP_ M);
|
|
#else
|
|
char mem[MR_BIG_RESERVE(M)];
|
|
memset(mem, 0, MR_BIG_RESERVE(M));
|
|
#endif
|
|
|
|
where M are the total number of big variables required. Recall that if
|
|
MR_STATIC is defined, bigs are assigned at compile time from the stack. If it
|
|
is not defined, bigs are assigned at run time from the heap. In either
|
|
case if a double sized variable is required...
|
|
|
|
|
|
(2) Assign space for big variable like this...
|
|
|
|
int j=0;
|
|
c=mirvar_mem(mip, mem, j); j+=2;
|
|
d=mirvar_mem(mip, mem, j); j+=2;
|
|
r=mirvar_mem(mip, mem, j); j+=2;
|
|
v1=mirvar_mem(mip, mem, j++);
|
|
v2=mirvar_mem(mip, mem, j++);
|
|
det=mirvar_mem(mip, mem, j); j+=2;
|
|
p=mirvar_mem(mip, mem, j++);
|
|
|
|
Observe how space for a double big is assigned to variables c,d,r and det, with
|
|
v1,v2 and p being assigned space for a regular big. Note that the final value j
|
|
here indicates the value that should be used for M above.
|
|
|
|
(3) Into mirdef.h, put
|
|
|
|
#define MR_DOUBLE_BIG
|
|
|
|
This tells MIRACL to assign double-width space to the internal work variables
|
|
w0-w7. All functions that just use these work variables will now work correctly
|
|
with the double-sized bigs.
|
|
|
|
Note that only simple arithmetic functions can be used with these double big
|
|
variables. But that should be OK, as group operations are usually very simple.
|
|
Note also that overflow checking is turned off when MR_DOUBLE_BIG is defined,
|
|
so use this feature with extreme caution!
|