Obj FuncINTFLOOR_MACFLOAT( Obj self, Obj obj ) { #if HAVE_TRUNC Double f = trunc(VAL_MACFLOAT(obj)); #else Double f = VAL_MACFLOAT(obj); if (f >= 0.0) f = floor(f); else f = -floor(-f); #endif if (fabs(f) < (Double) (1L<<NR_SMALL_INT_BITS)) return INTOBJ_INT((Int)f); int str_len = (int) (log(fabs(f)) / log(16.0)) + 3; Obj str = NEW_STRING(str_len); char *s = CSTR_STRING(str), *p = s+str_len-1; if (f < 0.0) f = -f, s[0] = '-'; while (p > s || (p == s && s[0] != '-')) { int d = (int) fmod(f,16.0); *p-- = d < 10 ? '0'+d : 'a'+d-10; f /= 16.0; } return FuncIntHexString(self,str); }
/**************************************************************************** ** *F PrintMacfloat( <macfloat> ) . . . . . . . . . . . . . . . . print a macfloat value ** ** 'PrintMacfloat' prints the macfloating value <macfloat>. */ void PrintMacfloat ( Obj x ) { Char buf[32]; snprintf(buf, sizeof(buf), "%.16" PRINTFFORMAT, (TOPRINTFFORMAT) VAL_MACFLOAT(x)); Pr("%s",(Int)buf, 0); }
double GAP_ValueMacFloat(Obj obj) { if (!IS_MACFLOAT(obj)) { ErrorMayQuit("<obj> is not a MacFloat", 0, 0); } return (double)VAL_MACFLOAT(obj); }
Obj FuncFREXP_MACFLOAT( Obj self, Obj f) { int i; Obj d = NEW_MACFLOAT(frexp (VAL_MACFLOAT(f), &i)); Obj l = NEW_PLIST(T_PLIST,2); SET_ELM_PLIST(l,1,d); SET_ELM_PLIST(l,2,INTOBJ_INT(i)); SET_LEN_PLIST(l,2); return l; }
Obj FuncSTRING_DIGITS_MACFLOAT( Obj self, Obj gapprec, Obj f) { Char buf[50]; Obj str; int prec = INT_INTOBJ(gapprec); if (prec > 40) /* too much anyways, and would risk buffer overrun */ prec = 40; snprintf(buf, sizeof(buf), "%.*" PRINTFFORMAT, prec, (TOPRINTFFORMAT)VAL_MACFLOAT(f)); C_NEW_STRING_DYN(str, buf); return str; }
Obj FuncLDEXP_MACFLOAT( Obj self, Obj f, Obj i) { return NEW_MACFLOAT(ldexp(VAL_MACFLOAT(f),INT_INTOBJ(i))); }
Obj SumIntMacfloat( Obj i, Obj f ) { return NEW_MACFLOAT( (Double)(INT_INTOBJ(i)) + VAL_MACFLOAT(f)); }
void SaveMacfloat( Obj obj ) { SaveDouble(VAL_MACFLOAT(obj)); return; }
Obj DiffMacfloat( Obj fl, Obj fr ) { return NEW_MACFLOAT(VAL_MACFLOAT(fl)-VAL_MACFLOAT(fr)); }
Obj SumMacfloat( Obj fl, Obj fr ) { return NEW_MACFLOAT(VAL_MACFLOAT(fl)+VAL_MACFLOAT(fr)); }
Obj PowMacfloat( Obj fl, Obj fr ) { return NEW_MACFLOAT(MATH(pow)(VAL_MACFLOAT(fl),VAL_MACFLOAT(fr))); }
Obj ProdMacfloat( Obj fl, Obj fr ) { return NEW_MACFLOAT(VAL_MACFLOAT(fl)*VAL_MACFLOAT(fr)); }
Obj InvMacfloat( Obj f ) { return NEW_MACFLOAT((Double)1.0/VAL_MACFLOAT(f)); }
Obj AInvMacfloat( Obj f ) { return NEW_MACFLOAT(-VAL_MACFLOAT(f)); }
Obj LQuoMacfloat( Obj fl, Obj fr ) { return NEW_MACFLOAT(VAL_MACFLOAT(fr)/VAL_MACFLOAT(fl)); }
/**************************************************************************** ** *F EqMacfloat( <macfloatL>, <macfloatR> ) . . . . . . . . . test if <macfloatL> = <macfloatR> ** ** 'EqMacfloat' returns 'True' if the two macfloatean values <macfloatL> and <macfloatR> are ** equal, and 'False' otherwise. */ Int EqMacfloat ( Obj macfloatL, Obj macfloatR ) { return VAL_MACFLOAT(macfloatL) == VAL_MACFLOAT(macfloatR); }
Obj ModMacfloat( Obj fl, Obj fr ) { return NEW_MACFLOAT(MATH(fmod)(VAL_MACFLOAT(fl),VAL_MACFLOAT(fr))); }
template<class Z> Obj dofplll(Obj gapmat, Obj lllargs, Obj svpargs) { if (!IS_PLIST(gapmat)) return INTOBJ_INT(-1); Int numrows = LEN_PLIST(gapmat), numcols = -1; for (int i = 1; i <= numrows; i++) { Obj row = ELM_PLIST(gapmat,i); if (numcols == -1) numcols = LEN_PLIST(row); if (numcols != LEN_PLIST(row)) return INTOBJ_INT(-1); } if (numcols <= 0) return INTOBJ_INT(-1); ZZ_mat<Z> mat(numrows, numcols); for (int i = 1; i <= numrows; i++) for (int j = 1; j <= numcols; j++) SET_INTOBJ(mat[i-1][j-1], ELM_PLIST(ELM_PLIST(gapmat,i),j)); if (lllargs != Fail) { double delta = 0.99; double eta = 0.51; LLLMethod method = LM_WRAPPER; FloatType floatType = FT_DEFAULT; int precision = 0; int flags = LLL_DEFAULT; if (lllargs != True) { if (!IS_PLIST(lllargs) || LEN_PLIST(lllargs) != 6) return INTOBJ_INT(-20); Obj v = ELM_PLIST(lllargs,1); if (IS_MACFLOAT(v)) delta = VAL_MACFLOAT(v); else if (v != Fail) return INTOBJ_INT(-21); v = ELM_PLIST(lllargs,2); if (IS_MACFLOAT(v)) eta = VAL_MACFLOAT(v); else if (v != Fail) return INTOBJ_INT(-22); v = ELM_PLIST(lllargs,3); if (v == INTOBJ_INT(0)) method = LM_WRAPPER; else if (v == INTOBJ_INT(1)) method = LM_PROVED; else if (v == INTOBJ_INT(2)) method = LM_HEURISTIC; else if (v == INTOBJ_INT(3)) method = LM_FAST; else if (v != Fail) return INTOBJ_INT(-23); v = ELM_PLIST(lllargs,4); if (v == INTOBJ_INT(0)) floatType = FT_DEFAULT; else if (v == INTOBJ_INT(1)) floatType = FT_DOUBLE; else if (v == INTOBJ_INT(2)) floatType = FT_DPE; else if (v == INTOBJ_INT(3)) floatType = FT_MPFR; else if (v != Fail) return INTOBJ_INT(-24); v = ELM_PLIST(lllargs,5); if (IS_INTOBJ(v)) precision = INT_INTOBJ(v); else if (v != Fail) return INTOBJ_INT(-25); v = ELM_PLIST(lllargs,6); if (IS_INTOBJ(v)) flags = INT_INTOBJ(v); else if (v != Fail) return INTOBJ_INT(-26); } int result = lllReduction(mat, delta, eta, method, floatType, precision, flags); if (result != RED_SUCCESS) return INTOBJ_INT(10*result+1); } if (svpargs != Fail) { SVPMethod method = SVPM_PROVED; int flags = SVP_DEFAULT; // __asm__ ("int3"); if (svpargs != True) { if (!IS_PLIST(svpargs) || LEN_PLIST(svpargs) != 2) return INTOBJ_INT(-30); Obj v = ELM_PLIST(svpargs,1); if (v == INTOBJ_INT(0)) method = SVPM_PROVED; else if (v == INTOBJ_INT(1)) method = SVPM_FAST; else if (v != Fail) return INTOBJ_INT(-31); v = ELM_PLIST(svpargs,2); if (IS_INTOBJ(v)) flags = INT_INTOBJ(v); else if (v != Fail) return INTOBJ_INT(-32); } vector<Integer> sol(numrows); IntMatrix svpmat(numrows,numcols); for (int i = 0; i < numrows; i++) for (int j = 0; j < numcols; j++) SET_Z(svpmat[i][j],mat[i][j]); int result = shortestVector(svpmat, sol, method, flags); if (result != RED_SUCCESS) return INTOBJ_INT(10*result+2); Obj gapvec; if (lllargs == Fail) { // return coordinates of shortest vector in mat gapvec = NEW_PLIST(T_PLIST,numrows); SET_LEN_PLIST(gapvec,numrows); for (int i = 1; i <= numrows; i++) { Obj v = GET_INTOBJ(sol[i-1]); SET_ELM_PLIST(gapvec,i,v); } } else { // return shortest vector gapvec = NEW_PLIST(T_PLIST,numcols); SET_LEN_PLIST(gapvec,numcols); for (int i = 1; i <= numcols; i++) { Integer s; s = 0; for (int j = 0; j < numrows; j++) s.addmul(sol[j],svpmat[j][i-1]); Obj v = GET_INTOBJ(s); SET_ELM_PLIST(gapvec,i,v); } } return gapvec; } gapmat = NEW_PLIST(T_PLIST,numrows); SET_LEN_PLIST(gapmat,numrows); for (int i = 1; i <= numrows; i++) { Obj gaprow = NEW_PLIST(T_PLIST,numcols); SET_LEN_PLIST(gaprow,numcols); SET_ELM_PLIST(gapmat,i,gaprow); for (int j = 1; j <= numcols; j++) { Obj v = GET_INTOBJ(mat[i-1][j-1]); SET_ELM_PLIST(gaprow,j,v); } } return gapmat; }
/**************************************************************************** ** *F LtMacfloat( <macfloatL>, <macfloatR> ) . . . . . . . . . test if <macfloatL> < <macfloatR> ** */ Int LtMacfloat ( Obj macfloatL, Obj macfloatR ) { return VAL_MACFLOAT(macfloatL) < VAL_MACFLOAT(macfloatR); }