📄 mrcomba.tpl
字号:
k[0]=k[1]=k[2]=k[3]=0; k[4]=k[7]=k[8]=c[17]; k[5]=c[18]; k[6]=c[12]; k[9]=0;
/*** DECREMENT ***/
overshoot-=carry;
k[2]=c[12]; k[3]=k[6]=k[7]=c[16]; k[0]=k[4]=c[10]; k[1]=k[5]=c[11]; k[8]=k[9]=c[18];
/*** DECREMENT ***/
overshoot-=carry;
k[0]=k[3]=k[4]=c[13]; k[2]=k[5]=k[6]=c[15]; k[1]=k[7]=k[8]=k[9]=0;
/*** DECREMENT ***/
overshoot-=carry;
k[1]=k[4]=k[5]=c[14]; k[0]=k[2]=k[3]=k[8]=0; k[6]=k[7]=k[9]=c[19];
/*** DECREMENT ***/
overshoot-=carry;
b=modulus->w;
while(overshoot>0)
{
/*** DECREMENT ***/
overshoot-=carry;
}
while (overshoot<0)
{
/*** INCREMENT ***/
overshoot+=carry;
}
if (z->w[MR_COMBA-1]>=modulus->w[MR_COMBA-1])
{
if (mr_compare(z,modulus)>=0)
{
/*** DECREMENT ***/
}
}
if (z->w[MR_COMBA-1]==0) mr_lzero(z);
#endif
#endif
#if MIRACL==32
#if MR_COMBA == 8
#ifdef MR_NOFULLWIDTH
/* Modulus is 2^255-19 - Experimental - not tested! */
w->w=&(t->w[10]);
w->len=9;
premult(_MIPP_ w,608,w);
incr(_MIPP_ w,19*(t->w[9]>>21),w);
t->w[9]&=(1<<21)-1;
t->len++;
z->len=10;
for (i=0;i<10;i++) z->w[i]=t->w[i];
comba_sub(z,w,z);
#endif
#endif
#if MR_COMBA == 4
/* Special code for 2^127-1 - for 32-bit processor */
a=t->w;
k[0]=a[4]; k[1]=a[5]; k[2]=a[6]; k[3]=a[7];
a=b=k;
/*** DOUBLEIT ***/
a=t->w;
k[0]+=(a[3]>>31); k[3]|=(a[3]&0x80000000);
c=z->w;
/*** ADDITION ***/
a=z->w;
b=modulus->w;
if (z->w[3]>=modulus->w[3])
{
if (mr_compare(z,modulus)>=0)
{
/*** DECREMENT ***/
}
}
if (z->w[MR_COMBA-1]==0) mr_lzero(z);
#endif
#if MR_COMBA == 6
/* Special Code for 2^192-2^64-1 - assuming 32-bit processor */
a=t->w; b=k; c=z->w;
k[0]=k[2]=a[6]; k[1]=k[3]=a[7]; k[4]=k[5]=0;
/*** ADDITION ***/
overshoot=carry;
a=c; c=t->w;
k[0]=k[1]=0; k[2]=k[4]=c[8]; k[3]=k[5]=c[9];
/*** INCREMENT ***/
overshoot+=carry;
k[0]=k[2]=k[4]=c[10]; k[1]=k[3]=k[5]=c[11];
/*** INCREMENT ***/
overshoot+=carry;
b=modulus->w;
while(overshoot>0)
{
/*** DECREMENT ***/
overshoot-=carry;
}
if (z->w[MR_COMBA-1]>=modulus->w[MR_COMBA-1])
{
if (mr_compare(z,modulus)>=0)
{
/*** DECREMENT ***/
}
}
if (z->w[MR_COMBA-1]==0) mr_lzero(z);
#endif
#if MR_COMBA == 7
/* Special Code for 2^224-2^96+1 - assuming 32-bit processor */
a=t->w; b=k; c=z->w;
k[0]=k[1]=k[2]=0; k[3]=a[7]; k[4]=a[8]; k[5]=a[9]; k[6]=a[10];
/*** ADDITION ***/
overshoot=carry;
a=c; c=t->w;
k[0]=k[1]=k[2]=k[6]=0; k[3]=c[11]; k[4]=c[12]; k[5]=c[13];
/*** INCREMENT ***/
overshoot+=carry;
k[0]=c[7]; k[1]=c[8]; k[2]=c[9]; k[3]=c[10]; k[4]=c[11]; k[5]=c[12]; k[6]=c[13];
/*** DECREMENT ***/
overshoot-=carry;
k[0]=c[11]; k[1]=c[12]; k[2]=c[13]; k[3]=k[4]=k[5]=k[6]=0;
/*** DECREMENT ***/
overshoot-=carry;
b=modulus->w;
while (overshoot>0)
{
/*** DECREMENT ***/
overshoot-=carry;
}
while (overshoot<0)
{
/*** INCREMENT ***/
overshoot+=carry;
}
if (z->w[MR_COMBA-1]>=modulus->w[MR_COMBA-1])
{
if (mr_compare(z,modulus)>=0)
{
/*** DECREMENT ***/
}
}
if (z->w[MR_COMBA-1]==0) mr_lzero(z);
#endif
#if MR_COMBA == 8
#ifndef MR_NOFULLWIDTH
a=t->w; b=k; c=z->w;
k[0]=k[1]=k[2]=0; k[3]=a[11]; k[4]=a[12]; k[5]=a[13]; k[6]=a[14]; k[7]=a[15];
/*** ADDITION ***/
overshoot=carry;
a=c; c=t->w;
/*** INCREMENT ***/
overshoot+=carry;
k[0]=k[1]=k[2]=0; k[3]=c[12]; k[4]=c[13]; k[5]=c[14]; k[6]=c[15]; k[7]=0;
/*** INCREMENT ***/
overshoot+=carry;
/*** INCREMENT ***/
overshoot+=carry;
k[0]=c[8]; k[1]=c[9]; k[2]=c[10]; k[3]=k[4]=k[5]=0; k[6]=c[14]; k[7]=c[15];
/*** INCREMENT ***/
overshoot+=carry;
k[0]=c[9]; k[1]=c[10]; k[2]=c[11]; k[3]=c[13]; k[4]=c[14]; k[5]=c[15]; k[6]=c[13]; k[7]=c[8];
/*** INCREMENT ***/
overshoot+=carry;
k[0]=c[11]; k[1]=c[12]; k[2]=c[13]; k[3]=k[4]=k[5]=0; k[6]=c[8]; k[7]=c[10];
/*** DECREMENT ***/
overshoot-=carry;
k[0]=c[12]; k[1]=c[13]; k[2]=c[14]; k[3]=c[15]; k[4]=k[5]=0; k[6]=c[9]; k[7]=c[11];
/*** DECREMENT ***/
overshoot-=carry;
k[0]=c[13]; k[1]=c[14]; k[2]=c[15]; k[3]=c[8]; k[4]=c[9]; k[5]=c[10]; k[6]=0; k[7]=c[12];
/*** DECREMENT ***/
overshoot-=carry;
k[0]=c[14]; k[1]=c[15]; k[2]=0; k[3]=c[9]; k[4]=c[10]; k[5]=c[11]; k[6]=0; k[7]=c[13];
/*** DECREMENT ***/
overshoot-=carry;
b=modulus->w;
while (overshoot>0)
{
/*** DECREMENT ***/
overshoot-=carry;
}
while (overshoot<0)
{
/*** INCREMENT ***/
overshoot+=carry;
}
if (z->w[MR_COMBA-1]>=modulus->w[MR_COMBA-1])
{
if (compare(z,modulus)>=0)
{
/*** DECREMENT ***/
}
}
if (z->w[MR_COMBA-1]==0) mr_lzero(z);
#endif
#endif
#if MR_COMBA == 17
/* Special Code for 2^521-1 - assuming 32-bit processor */
/* split t into 521-bit halves, low half in a, high half in b */
a=t->w; b=k; c=z->w;
for (i=0;i<=16;i++)
b[i]=(a[i+16]>>9)|(a[i+17]<<23);
b[16]|=(-(a[16]>>9)<<9); /* clever stuff! Set top part of b[16] to minus *
* top part of a[16]. When added they cancel out */
/*** ADDITION ***/
/* ignore carry=1 */
a=z->w;
b=modulus->w;
if (z->w[MR_COMBA-1]>=modulus->w[MR_COMBA-1])
{
if (mr_compare(z,modulus)>=0)
{
/*** DECREMENT ***/
}
}
if (z->w[MR_COMBA-1]==0) mr_lzero(z);
#endif
#endif
#endif
#else
modulus=mr_mip->modulus;
ndash=mr_mip->ndash;
w=mr_mip->w0;
if (t!=w) copy(t,w);
w->len=2*MR_COMBA+1;
a=w->w; b=modulus->w;
/*** REDC ***/ /* reduces a mod b */
for (i=MR_COMBA;i<(int)(z->len&MR_OBITS);i++) z->w[i]=0;
z->len=MR_COMBA;
for (i=0;i<MR_COMBA;i++) z->w[i]=w->w[i+MR_COMBA];
need_subtract=FALSE;
if (w->w[MR_COMBA+MR_COMBA]!=0)
{
need_subtract=TRUE;
}
else
{
if (z->w[MR_COMBA-1]!=0)
{
if (z->w[MR_COMBA-1]>modulus->w[MR_COMBA-1]) need_subtract=TRUE;
else
{
if (z->w[MR_COMBA-1]==modulus->w[MR_COMBA-1])
{
if (mr_compare(z,modulus)>=0) need_subtract=TRUE;
}
}
}
else mr_lzero(z);
}
if (need_subtract)
{
a=z->w; b=modulus->w;
/*** DECREMENT ***/
z->len=MR_COMBA;
if (z->w[MR_COMBA-1]==0) mr_lzero(z);
}
#endif
}
#ifdef MR_SPECIAL
#ifdef MR_GENERALIZED_MERSENNE
#if MIRACL*MR_COMBA == 128
#define MR_FAST_MOD_ADD 2
#endif
#endif
#endif
#ifdef MR_SPECIAL
#ifdef MR_PSEUDO_MERSENNE
#define MR_FAST_MOD_ADD 1
#define MR_OP(c) ( ((mr_utype)((c)<<M1)) >>M1)
#endif
#endif
void comba_add(_MIPD_ big x,big y,big w)
{ /* fast modular addition */
unsigned int i;
big modulus;
BOOL dodec;
mr_small *a,*b,*c;
mr_small carry,su;
#ifdef MR_WIN64
mr_small ma,mb,u;
#endif
#ifdef MR_ITANIUM
mr_small ma,mb,u;
#endif
#ifdef MR_NOASM
mr_large u;
#endif
#ifdef MR_FAST_MOD_ADD
mr_small sc,t,v;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
modulus=mr_mip->modulus;
if (w!=x && w!=y)
{
for (i=MR_COMBA;i<(w->len&MR_OBITS);i++) w->w[i]=0;
/* zero(w); */
}
a=x->w; b=y->w; c=w->w;
/*** ADDITION ***/ /* add a and b, result in c */
w->len=MR_COMBA;
#ifdef MR_FAST_MOD_ADD
#if MR_FAST_MOD_ADD == 1
sc=(mr_small)0-modulus->w[0]; /* Modulus is 2^{MIRACL*MR_COMBA}-c. Here we calculate c */
t=MR_OP(carry)≻
v=w->w[0]+t;
if (v>=w->w[0])
{
w->w[0]=v;
carry=0;
}
#endif
#if MR_FAST_MOD_ADD == 2
t=(mr_small)(w->w[MR_COMBA-1]>>M1);
v=w->w[0]+t;
if (v>=w->w[0])
{
w->w[MR_COMBA-1]-=(mr_small)(t<<M1);
w->w[0]=v;
carry=0;
}
#endif
#endif
/* if sum is greater than modulus a decrement will be required */
dodec=FALSE;
if (carry) dodec=TRUE; /* possible misprediction here */
else
{
if (w->w[MR_COMBA-1]>modulus->w[MR_COMBA-1]) dodec=TRUE; /* possible misprediction here */
else
{
if (w->w[MR_COMBA-1]==modulus->w[MR_COMBA-1]) /* this will be very rare, so easily predicted */
{ /* trying to avoid calling this slow function */
if (mr_compare(w,modulus)>=0) dodec=TRUE; /* do full comparison */
}
}
}
if (dodec) /* prediction here correlated to earlier predictions, so should predict nicely */
{
a=w->w; b=modulus->w;
/*** DECREMENT ***/ /* decrement b from a */
}
if (w->w[MR_COMBA-1]==0) mr_lzero(w);
}
void comba_sub(_MIPD_ big x,big y,big w)
{ /* fast modular subtraction */
unsigned int i;
big modulus;
mr_small *a,*b,*c;
mr_small carry,su;
#ifdef MR_WIN64
mr_small ma,mb,u;
#endif
#ifdef MR_ITANIUM
mr_small ma,u;
#endif
#ifdef MR_NOASM
mr_large u;
#endif
#ifdef MR_FAST_MOD_ADD
mr_small sc,t,v;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
modulus=mr_mip->modulus;
if (x!=w && y!=w)
{
for (i=MR_COMBA;i<(w->len&MR_OBITS);i++) w->w[i]=0;
/* zero(w); */
}
a=x->w; b=y->w; c=w->w;
/*** SUBTRACTION ***/
#ifdef MR_FAST_MOD_ADD
#if MR_FAST_MOD_ADD == 1
sc=(mr_small)0-modulus->w[0]; /* Modulus is 2^{MIRACL*MR_COMBA}-c. Here we calculate c */
t=MR_OP(carry)≻
v=w->w[0]-t;
if (v<=w->w[0])
{
w->w[0]=v;
carry=0;
}
#endif
#if MR_FAST_MOD_ADD == 2
t=(w->w[MR_COMBA-1]>>M1);
v=w->w[0]-t;
if (v<=w->w[0])
{
w->w[MR_COMBA-1]-=(t<<M1);
w->w[0]=v;
carry=0;
}
#endif
#endif
if (carry)
{
a=w->w; b=modulus->w;
/*** INCREMENT ***/ /* add a and b, result in c */
}
w->len=MR_COMBA;
if (w->w[MR_COMBA-1]==0) mr_lzero(w);
}
#ifndef MR_NO_LAZY_REDUCTION
void comba_double_add(_MIPD_ big x,big y,big w)
{ /* fast modular addition */
unsigned int i;
big modulus;
BOOL dodec;
mr_small *a,*b,*c;
mr_small carry,su;
#ifdef MR_WIN64
mr_small ma,mb,u;
#endif
#ifdef MR_ITANIUM
mr_small ma,u;
#endif
#ifdef MR_NOASM
mr_large u;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
modulus=mr_mip->pR;
if (w!=x && w!=y)
{
for (i=2*MR_COMBA;i<(w->len&MR_OBITS);i++) w->w[i]=0;
/* zero(w); */
}
a=x->w; b=y->w; c=w->w;
/*** ADDITION2 ***/ /* add a and b, result in c */
w->len=2*MR_COMBA;
/* if sum is greater than modulus a decrement will be required */
dodec=FALSE;
if (carry) dodec=TRUE; /* possible misprediction here */
else
{
if (w->w[2*MR_COMBA-1]>modulus->w[2*MR_COMBA-1]) dodec=TRUE; /* possible misprediction here */
else
{
if (w->w[2*MR_COMBA-1]==modulus->w[2*MR_COMBA-1]) /* this will be very rare, so easily predicted */
{
if (mr_compare(w,modulus)>=0) dodec=TRUE; /* do full comparison */
}
}
}
if (dodec) /* prediction here correlated to earlier predictions, so should predict nicely */
{
a=&(w->w[MR_COMBA]); b=&(modulus->w[MR_COMBA]);
/*** DECREMENT ***/ /* decrement b from a */
}
if (w->w[2*MR_COMBA-1]==0) mr_lzero(w);
}
void comba_double_sub(_MIPD_ big x,big y,big w)
{ /* fast modular subtraction */
unsigned int i;
big modulus;
mr_small *a,*b,*c;
mr_small carry,su;
#ifdef MR_WIN64
mr_small ma,mb,u;
#endif
#ifdef MR_ITANIUM
mr_small ma,u;
#endif
#ifdef MR_NOASM
mr_large u;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
modulus=mr_mip->modulus;
if (x!=w && y!=w)
{
for (i=2*MR_COMBA;i<(w->len&MR_OBITS);i++) w->w[i]=0;
/* zero(w); */
}
a=x->w; b=y->w; c=w->w;
/*** SUBTRACTION2 ***/
if (carry)
{
a=&(w->w[MR_COMBA]); b=modulus->w;
/*** INCREMENT ***/ /* add a and b, result in c */
}
w->len=2*MR_COMBA;
if (w->w[2*MR_COMBA-1]==0) mr_lzero(w);
}
#endif
void comba_negate(_MIPD_ big x,big w)
{ /* fast modular subtraction */
unsigned int i;
big modulus;
mr_small *a,*b,*c;
mr_small carry,su;
#ifdef MR_WIN64
mr_small ma,mb,u;
#endif
#ifdef MR_ITANIUM
mr_small ma,u;
#endif
#ifdef MR_NOASM
mr_large u;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
modulus=mr_mip->modulus;
if (w!=x)
{
for (i=MR_COMBA;i<(w->len&MR_OBITS);i++) w->w[i]=0;
/* zero(w); */
}
a=modulus->w; b=x->w; c=w->w;
/*** SUBTRACTION ***/
w->len=MR_COMBA;
if (w->w[MR_COMBA-1]==0) mr_lzero(w);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -