mirror of
https://git.code.sf.net/p/newrpl/sources
synced 2024-11-16 19:51:25 +01:00
Improved sqrt algorithm.
This commit is contained in:
parent
298fae296d
commit
1811119738
3 changed files with 35 additions and 3 deletions
|
@ -677,3 +677,30 @@ void powmodReal(REAL *result,REAL *a,REAL *b,REAL *mod)
|
|||
|
||||
// RESULT IS IN result
|
||||
}
|
||||
|
||||
|
||||
// COMPUTE GCD OF 2 REALS
|
||||
// USE DIVISION OR SUBTRACTION, WHATEVER IS FASTER ON EACH LOOP
|
||||
/*
|
||||
void gcdReal(REAL *result,REAL *a,REAL *b)
|
||||
{
|
||||
|
||||
copyReal(&RReg[0],a);
|
||||
copyReal(&RReg[1],b);
|
||||
RReg[0].flags&=~F_NEGATIVE;
|
||||
RReg[1].flags&=~F_NEGATIVE;
|
||||
|
||||
BINT idxa;
|
||||
|
||||
if(gtReal(a,b)) idxa=0; else idxa=1;
|
||||
|
||||
#define REG_a RReg[idxa]
|
||||
#define REG_b RReg[idxa^1]
|
||||
|
||||
while( (!iszeroReal(REG_b))&&(!eqReal(REG_a,REG_b)))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
CMD(DIGITS,MKTOKENINFO(6,TITYPE_FUNCTION,3,2)), \
|
||||
CMD(PROOT,MKTOKENINFO(5,TITYPE_FUNCTION,1,2)), \
|
||||
CMD(PREVPRIME,MKTOKENINFO(9,TITYPE_FUNCTION,1,2)), \
|
||||
CMD(FACTORS,MKTOKENINFO(7,TITYPE_FUNCTION,1,2)))
|
||||
CMD(FACTORS,MKTOKENINFO(7,TITYPE_FUNCTION,1,2))
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -327,9 +327,10 @@ RReg[2].exp=0;
|
|||
RReg[2].flags=0;
|
||||
RReg[2].len=1;
|
||||
int savedprec=Context.precdigits;
|
||||
int maxprec=(Context.precdigits+15)&~7;
|
||||
|
||||
// Halley's method
|
||||
Context.precdigits=(Context.precdigits+15)&~7;
|
||||
Context.precdigits=8;
|
||||
int iters=0;
|
||||
int goodexp,gooddigits=0;
|
||||
do {
|
||||
|
@ -352,10 +353,14 @@ mulReal(&RReg[4],&RReg[2],&RReg[3]); // x(n+1)=0.125*xn*(15-yn*(10-3*yn))
|
|||
swapReal(&RReg[4],&RReg[1]);
|
||||
subReal(&RReg[3],&RReg[4],&RReg[1]);
|
||||
if(RReg[3].len>1) continue;
|
||||
if(RReg[3].data[0]==0) break;
|
||||
|
||||
if((Context.precdigits==maxprec) && (RReg[3].data[0]==0)) break;
|
||||
goodexp=RReg[3].exp+sig_digits(RReg[3].data[0]);
|
||||
gooddigits=intdigitsReal(&RReg[1])-RReg[1].exp;
|
||||
gooddigits-=goodexp-RReg[1].exp;
|
||||
Context.precdigits+=Context.precdigits; // DOUBLE THE PRECISION AT EACH STEP
|
||||
if(Context.precdigits<8) Context.precdigits=8;
|
||||
if(Context.precdigits>maxprec) Context.precdigits=maxprec;
|
||||
|
||||
} while(gooddigits<=savedprec);
|
||||
|
||||
|
|
Loading…
Reference in a new issue