=================================================================== RCS file: /home/cvs/OpenXM/src/ox_ntl/ntl.cpp,v retrieving revision 1.1 retrieving revision 1.3 diff -u -p -r1.1 -r1.3 --- OpenXM/src/ox_ntl/ntl.cpp 2003/11/03 03:11:21 1.1 +++ OpenXM/src/ox_ntl/ntl.cpp 2003/11/15 09:06:20 1.3 @@ -1,333 +1,67 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM/src/ox_ntl/ntl.cpp,v 1.2 2003/11/08 12:34:00 iwane Exp $ */ #include -#include +#include -#include -#include - +#include "ox_toolkit.h" #include "ntl.h" +#if __NTL_DEBUG +#define __NTL_PRINT (1) +#endif -/*==========================================================================* - * Check string format - *==========================================================================*/ +#define __NTL_PRINT (1) +#define DPRINTF(x) printf x; fflush(stdout) -#define NtlIsSpace(c) ((c) == ' ' || (c) == '\t') -#define NtlIsDigit(c) ((c) >= '0' && (c) <= '9') - /**************************************************************************** * - * test for string format of integer + * Factorize polynomial over the integers. * - * PARAM : I : str : string - * : O : endptr : - * RETURN: !0 : the string tests true - * : 0 : the string tests false + * PARAM : I : arg : polynomial + * : I : argc : + * RETURN: [num,[[factor1,multiplicity1],[factor2,multiplicity2],...]] * - ****************************************************************************/ -static int -ntl_isZZstr_(const char *str, char const **endptr) -{ - while (NtlIsSpace(*str)) - str++; - - /* NTL reject "+999" */ - if (*str == '-') - str++; - - if (!NtlIsDigit(*str)) - return (0); - - str++; - - while (NtlIsDigit(*str)) - str++; - - *endptr = str; - - return (!0); - -} - -static int -ntl_isZZstr(const char *str) -{ - const char *ptr; - int ret = ntl_isZZstr_(str, &ptr); - if (!ret) - return (ret); - - while (NtlIsSpace(*ptr)) - ptr++; - - return (*ptr == '\0'); -} - - -/**************************************************************************** + * EX : ntl_fctr([2*x^11+4*x^8-2*x^6+2*x^5-4*x^3-2],1) ==> + : [2,[[x-1,1],[x^4+x^3+x^2+x+1,1],[x+1,2],[x^2-x+1,2]]] * - * test for string format of univariate polynomials with integer coefficients - * in NTL style. - * - * PARAM : I : str : string - * : O : endptr : - * RETURN: !0 : the string tests true - * : 0 : the string tests false - * ****************************************************************************/ -static int -ntl_isZZXstr_(const char *str, char const **endptr) +cmo * +ntl_fctr(cmo **arg, int argc) { - const char *s; - - while (NtlIsSpace(*str)) - str++; - - if (*str != '[') - return (0); - - str++; - - while (*str != ']' && *str != '\0') { - - if (!ntl_isZZstr_(str, &s)) - return (0); - str = s; - - while (NtlIsSpace(*str)) - str++; - } - - while (NtlIsSpace(*str)) - str++; - - if (*str != ']') - return (0); - - str++; - *endptr = str; - return (!0); -} - -static int -ntl_isZZXstr(const char *str) -{ - const char *ptr; - int ret = ntl_isZZXstr_(str, &ptr); - if (!ret) - return (ret); - - while (NtlIsSpace(*ptr)) - ptr++; - - return (*ptr == '\0'); -} - - -/*==========================================================================* - * Convert - *==========================================================================*/ -static cmo_zz * -ZZ_to_cmo_zz(const ZZ &z) -{ - cmo_zz *c; - - ostrstream sout; - sout << z << '\0'; - - c = new_cmo_zz_set_string(sout.str()); - - return (c); -} - - -static int -cmo_to_ZZ(ZZ &z, cmo *c) -{ - int ret = NTL_SUCCESS; - char *str; - - switch (c->tag) { - case CMO_ZERO: - z = to_ZZ(0); - break; - case CMO_ZZ: - { - str = new_string_set_cmo(c); - istrstream sin(str, strlen(str)); - sin >> z; - break; - } - case CMO_INT32: - z = to_ZZ(((cmo_int32 *)c)->i); - break; - case CMO_STRING: - { - str = ((cmo_string *)c)->s; - if (!ntl_isZZstr(str)) - return (NTL_FAILURE); - - istrstream sin(str, strlen(str)); - sin >> z; - break; - } - default: - ret = NTL_FAILURE; - break; - } - - return (ret); -} - - -static int -cmo_to_ZZX(ZZX &f, cmo *m, cmo_indeterminate *&x) -{ - char *str; + cmo *poly = arg[0]; + cmo_indeterminate *x; + ZZX f; int ret; - switch (m->tag) { - case CMO_STRING: /* [ 3 4 7 ] ==> 3+4*x+7*x^2 */ - str = ((cmo_string *)m)->s; - ret = 0; //ntl_isZZXstr(str); - - if (!ret) { - /* format error */ - return (NTL_FAILURE); - } - - { - istrstream sin(str, strlen(str)); - sin >> f; - } - break; - case CMO_RECURSIVE_POLYNOMIAL: - { - cmo_recursive_polynomial *rec = (cmo_recursive_polynomial *)m; - cmo_polynomial_in_one_variable *poly = (cmo_polynomial_in_one_variable *)rec->coef; - cell *el; - int len; - - if (poly->tag != CMO_POLYNOMIAL_IN_ONE_VARIABLE) { - return (NTL_FAILURE); - } - - el = list_first((cmo_list *)poly); - len = list_length((cmo_list *)poly); - - f = 0; - - while (!list_endof((cmo_list *)poly, el)) { - ZZ c; - ostrstream sout; - cmo *coef = el->cmo; - int exp = el->exp; - - ret = cmo_to_ZZ(c, coef); - if (ret != NTL_SUCCESS) { - return (NTL_FAILURE); - } - - SetCoeff(f, exp, c); - - el = list_next(el); - } - - - el = list_first(rec->ringdef); - x = (cmo_indeterminate *)el->cmo; - - break; + if (argc != 1) { + return ((cmo *)new_cmo_error2((cmo *)new_cmo_string("Invalid Parameter(#)"))); } - default: - break; - } - return (NTL_SUCCESS); -} -/**************************************************************************** - * - * - * - * PARAM : I : arg : polynomial - * : I : argc : - * RETURN: [[num, 1],[factor1,multiplicity1],[factor2,multiplicity2],...] - * - * EX : - * - ****************************************************************************/ -static cmo_recursive_polynomial * -ZZX_to_cmo(ZZX &factor, cmo_indeterminate *x) -{ - cmo_recursive_polynomial *rec; - cmo_polynomial_in_one_variable *poly; - - cmo_list *ringdef; - int i; - cmo *coef; - - ringdef = new_cmo_list(); - list_append(ringdef, (cmo *)x); - - poly = new_cmo_polynomial_in_one_variable(0); - for (i = deg(factor); i >= 0; i--) { - if (coeff(factor, i) == 0) - continue; - - coef = (cmo *)ZZ_to_cmo_zz(coeff(factor, i)); - list_append_monomial((cmo_list *)poly, coef, i); + ret = cmo_to_ZZX(f, poly, x); + if (ret != NTL_SUCCESS) { + /* format error */ + return ((cmo *)new_cmo_error2((cmo *)new_cmo_string("Invalid Parameter(type)"))); } - rec = new_cmo_recursive_polynomial(ringdef, (cmo *)poly); - return (rec); -} +#if __NTL_PRINT + cout << "input: " << f << endl; +#endif + cmon_factors_t *factors = new_cmon_factors(); + factors->x = x; -static cmo_list * -new_cmo_pair_ZZX_int(ZZX &factors, int d, cmo_indeterminate *x) -{ - cmo_recursive_polynomial *poly; - cmo_int32 *deg; - cmo_list *list; + factor(*factors->cont, *factors->f, f); - poly = ZZX_to_cmo(factors, x); - deg = new_cmo_int32(d); +#if __NTL_PRINT + cout << "fctr : " << *factors->f << endl; +#endif - list = list_appendl(NULL, poly, deg, NULL); - return (list); + return ((cmo *)factors); } - /**************************************************************************** * - * convert vec_pair_ZZX_long(list of factor and multiplicity) to cmo_list - * - * PARAM : I : factors : list of factor and multiplicity - * : : : [[factor1,multiplicity1][factor2,multiplicity2]...] - * : I : x : indeterminate - * RETURN: - * - ****************************************************************************/ -static cmo_list * -factors_to_cmo(vec_pair_ZZX_long &factors, cmo_indeterminate *x) -{ - int i; - cmo_list *list = new_cmo_list(); - cmo_list *factor; - - for (i = 0; i < factors.length(); i++) { - factor = new_cmo_pair_ZZX_int(factors[i].a, factors[i].b, x); - list_append(list, (cmo *)factor); - } - - return (list); -} - - -/**************************************************************************** - * * Factorize polynomial over the integers. * * PARAM : I : arg : polynomial @@ -339,41 +73,76 @@ factors_to_cmo(vec_pair_ZZX_long &factors, cmo_indeter * ****************************************************************************/ cmo * -ntl_fctr(cmo **arg, int argc) +ntl_lll(cmo **arg, int argc) { cmo *poly = arg[0]; cmo_indeterminate *x; ZZX f; - ZZ c; - int ret; + cmon_mat_zz_t *mat; + +DPRINTF(("lll start\n")); - vec_pair_ZZX_long factors; - - cmo_list *ans; - cmo *fcts; - if (argc != 1) { +DPRINTF(("invalid argc %d\n", argc)); return ((cmo *)new_cmo_error2((cmo *)new_cmo_string("Invalid Parameter(#)"))); } - ret = cmo_to_ZZX(f, poly, x); + mat = new_cmon_mat_zz(); + ret = cmo_to_mat_zz(*mat->mat, arg[0]); +DPRINTF(("ret = %d, convert\n", ret)); if (ret != NTL_SUCCESS) { +DPRINTF(("convert failed\n", ret)); + delete_cmon_mat_zz(mat); /* format error */ return ((cmo *)new_cmo_error2((cmo *)new_cmo_string("Invalid Parameter(type)"))); } - factor(c, factors, f); +DPRINTF(("convert success\n", ret)); - cmo_zz *zz = ZZ_to_cmo_zz(c); +#if __NTL_PRINT +DPRINTF(("convert success\n", ret)); + cout << "input: " << (*mat->mat) << endl; +#endif - ans = new_cmo_list(); - fcts = (cmo *)factors_to_cmo(factors, x); +DPRINTF(("lll start\n", ret)); + ZZ det2; + long rd = LLL(det2, *mat->mat); - list_appendl(ans, zz, (cmo *)fcts, NULL); - return ((cmo *)ans); +#if __NTL_PRINT + cout << "output: " << (*mat->mat) << endl; +#endif + + return ((cmo *)mat); } + + +#if __NTL_DEBUG /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + +int +main(int argc, char *argv[]) +{ + ZZX f; + const char *str = "[1 -1 -1 1]"; + int num = 1; + char *var = "x"; + cmo *c; + + f = to_ZZ(str);; + + cmo_indeterminate *x = new_cmo_indeterminate((cmo *)new_cmo_string(var)); + cmo_recursive_polynomial *poly = ZZX_to_cmo(f, x); + cmo *arg[3]; + + arg[0] = (cmo *)poly; + + c = ntl_fctr(arg, num); + + return (0); +} + +#endif