=================================================================== RCS file: /home/cvs/OpenXM/src/ox_ntl/ntl.cpp,v retrieving revision 1.1 retrieving revision 1.7 diff -u -p -r1.1 -r1.7 --- OpenXM/src/ox_ntl/ntl.cpp 2003/11/03 03:11:21 1.1 +++ OpenXM/src/ox_ntl/ntl.cpp 2013/10/18 01:28:52 1.7 @@ -1,379 +1,209 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM/src/ox_ntl/ntl.cpp,v 1.6 2008/09/19 10:55:40 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 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],...]] * + * 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]]] + * ****************************************************************************/ -static int -ntl_isZZstr_(const char *str, char const **endptr) +oxstack_node * +ntl_fctr(oxstack_node **arg, int argc) { - while (NtlIsSpace(*str)) - str++; + oxstack_node *p = arg[0]; + cmo *poly = p->c; + cmo_indeterminate *x; + cmo *err; + ZZX f; + int ret; + char emss[25] = "Invalid Parameter(#)"; + char emst[25] = "Invalid Parameter(type)"; - /* NTL reject "+999" */ - if (*str == '-') - str++; + if (argc != 1) { + err = ((cmo *)new_cmo_error2((cmo *)new_cmo_string(emss))); + p = oxstack_node_init(err); + return (p); + } - if (!NtlIsDigit(*str)) - return (0); + ret = cmo_to_ZZX(f, poly, x); + if (ret != NTL_SUCCESS) { + /* format error */ + err = (cmo *)new_cmo_error2((cmo *)new_cmo_string(emst)); + p = oxstack_node_init(err); + return (p); + } - str++; +#if __NTL_PRINT + std::cout << "input: " << f << std::endl; +#endif - while (NtlIsDigit(*str)) - str++; + cmon_factors_t *factors = new_cmon_factors(); + factors->x = x; - *endptr = str; + factor(*factors->cont, *factors->f, f); - return (!0); +#if __NTL_PRINT + std::cout << "fctr : " << *factors->f << std::endl; +#endif -} + p = oxstack_node_init(NULL); + p->p = factors; -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'); + return (p); } - /**************************************************************************** * - * test for string format of univariate polynomials with integer coefficients - * in NTL style. + * 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],...]] * + * 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]]] + * ****************************************************************************/ -static int -ntl_isZZXstr_(const char *str, char const **endptr) +oxstack_node * +ntl_lll(oxstack_node **arg, int argc) { - const char *s; + oxstack_node *p = arg[0]; + cmo *err; + ZZX f; + int ret; + cmon_mat_zz_t *mat; + char emss[25] = "Invalid Parameter(#)"; + char emst[25] = "Invalid Parameter(type)"; - while (NtlIsSpace(*str)) - str++; + if (argc != 1) { + err = ((cmo *)new_cmo_error2((cmo *)new_cmo_string(emss))); + p = oxstack_node_init(err); + return (p); + } - if (*str != '[') - return (0); - - str++; - - while (*str != ']' && *str != '\0') { - - if (!ntl_isZZstr_(str, &s)) - return (0); - str = s; - - while (NtlIsSpace(*str)) - str++; + mat = new_cmon_mat_zz(); + ret = cmo_to_mat_zz(*mat->mat, p->c); + if (ret != NTL_SUCCESS) { + delete_cmon_mat_zz(mat); + /* format error */ + err = ((cmo *)new_cmo_error2((cmo *)new_cmo_string(emst))); + p = oxstack_node_init(err); + return (p); } - while (NtlIsSpace(*str)) - str++; +#if __NTL_PRINT + std::cout << "input: " << (*mat->mat) << std::endl; +#endif - if (*str != ']') - return (0); + ZZ det2; + mat_ZZ U; - str++; - *endptr = str; - return (!0); -} +#if __NTL_PRINT + std::cout << "output: " << (*mat->mat) << std::endl; + std::cout << U <p = mat; + return (p); } -/*==========================================================================* - * Convert - *==========================================================================*/ -static cmo_zz * -ZZ_to_cmo_zz(const ZZ &z) -{ - cmo_zz *c; - ostrstream sout; - sout << z << '\0'; +#if __NTL_DEBUG /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ - c = new_cmo_zz_set_string(sout.str()); +#include +#include - return (c); -} +void ntl_free(void *ptr, size_t size) {} - -static int -cmo_to_ZZ(ZZ &z, cmo *c) +void *ntl_realloc(void *org, size_t old, size_t size) { - 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); + void *ptr = GC_realloc(org, size); + return (ptr); } -static int -cmo_to_ZZX(ZZX &f, cmo *m, cmo_indeterminate *&x) +int +main(int argc, char *argv[]) { - char *str; - int ret; +#if 0 +{ + ZZX f; + const char *str = "12345"; + int num = 1; + char *var = "x"; + cmo *c; - 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); + f = to_ZZ(str);; - if (!ret) { - /* format error */ - return (NTL_FAILURE); - } + cmo_indeterminate *x = new_cmo_indeterminate((cmo *)new_cmo_string(var)); + cmo_recursive_polynomial *poly = ZZX_to_cmo(f, x); + cmo *arg[3]; - { - 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; + arg[0] = (cmo *)poly; - 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; - } - default: - break; - } - return (NTL_SUCCESS); + c = ntl_fctr(arg, num); } +#endif -/**************************************************************************** - * - * - * - * 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; + + ZZ cont; + ZZX fac; + vec_pair_ZZX_long facs; +// char xx[2] = "x"; +// cmo_indeterminate *x = new_cmo_indeterminate((cmo *)new_cmo_string(xx)); - cmo_list *ringdef; - int i; - cmo *coef; +// std::istringstream istr("[3 -3 -6]"); +// istr >> fac; - ringdef = new_cmo_list(); - list_append(ringdef, (cmo *)x); + SetCoeff(fac, 0, 3); + SetCoeff(fac, 1, -3); + SetCoeff(fac, 2, -6); - 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); - } + factor(cont, facs, fac); - rec = new_cmo_recursive_polynomial(ringdef, (cmo *)poly); - return (rec); + // mpz_clear(ppp->mpz); } +if (0) { + mp_set_memory_functions(GC_malloc, ntl_realloc, ntl_free); + for (int i = 0;; i++) { -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; +// cmon_factors_t *mat = new_cmon_factors(cont, facs, x); +// cmo *aaa = convert_cmon((cmo *)mat); +// delete_cmon((cmo *)mat); - poly = ZZX_to_cmo(factors, x); - deg = new_cmo_int32(d); - - list = list_appendl(NULL, poly, deg, NULL); - - return (list); -} - - -/**************************************************************************** - * - * 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); + if (i % 1000 == 0) { + printf("GC-counts: %lu, size: %u\n", GC_gc_no, GC_get_heap_size()); + GC_gcollect(); + usleep(1); + } } - - return (list); } -/**************************************************************************** - * - * Factorize polynomial over the integers. - * - * PARAM : I : arg : polynomial - * : I : argc : - * RETURN: [num,[[factor1,multiplicity1],[factor2,multiplicity2],...]] - * - * 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]]] - * - ****************************************************************************/ -cmo * -ntl_fctr(cmo **arg, int argc) -{ - cmo *poly = arg[0]; - cmo_indeterminate *x; - ZZX f; - ZZ c; - - int ret; - - vec_pair_ZZX_long factors; - - cmo_list *ans; - cmo *fcts; - - if (argc != 1) { - return ((cmo *)new_cmo_error2((cmo *)new_cmo_string("Invalid Parameter(#)"))); - } - - 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)"))); - } - - factor(c, factors, f); - - cmo_zz *zz = ZZ_to_cmo_zz(c); - - ans = new_cmo_list(); - - fcts = (cmo *)factors_to_cmo(factors, x); - - list_appendl(ans, zz, (cmo *)fcts, NULL); - - return ((cmo *)ans); + return (0); } +#endif /* __NTL_DEBUG @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/