=================================================================== RCS file: /home/cvs/OpenXM/src/ox_ntl/ntlconv.cpp,v retrieving revision 1.1 retrieving revision 1.6 diff -u -p -r1.1 -r1.6 --- OpenXM/src/ox_ntl/ntlconv.cpp 2003/11/08 12:34:00 1.1 +++ OpenXM/src/ox_ntl/ntlconv.cpp 2013/10/18 01:28:52 1.6 @@ -1,8 +1,11 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM/src/ox_ntl/ntlconv.cpp,v 1.5 2003/11/27 14:19:50 iwane Exp $ */ #include +#include -#include +#include +#include +#include #include "ntl.h" @@ -11,6 +14,14 @@ #endif /*==========================================================================* + * Block interrupt input + *==========================================================================*/ +#define BLOCK_NEW_CMO() BLOCK_INPUT() +#define UNBLOCK_NEW_CMO() UNBLOCK_INPUT() + + + +/*==========================================================================* * Check string format *==========================================================================*/ @@ -139,12 +150,17 @@ cmo_zz * ZZ_to_cmo_zz(const ZZ &z) { cmo_zz *c; + const char *ptr; - ostrstream sout; + std::ostringstream sout; sout << z << '\0'; + std::string tmp = sout.str(); + ptr = tmp.c_str(); - c = new_cmo_zz_set_string(sout.str()); - + BLOCK_NEW_CMO(); + c = new_cmo_zz_set_string((char*)ptr); + UNBLOCK_NEW_CMO(); + return (c); } @@ -165,6 +181,7 @@ cmo_to_ZZ(ZZ &z, cmo *c) switch (c->tag) { case CMO_ZERO: + case CMO_NULL: z = to_ZZ(0); break; case CMO_ZZ: @@ -202,7 +219,112 @@ cmo_to_ZZ(ZZ &z, cmo *c) * RETURN: success : NTL_SUCCESS * : failure : NTL_FAILURE ****************************************************************************/ +cmo_list * +mat_zz_to_cmo(mat_ZZ &mat) +{ + cmo_list *list; + + cmo_zz *zz; + int row, col; + int i, j; + + row = (int)mat.NumRows(); + col = (int)mat.NumCols(); + + BLOCK_NEW_CMO(); + list = list_appendl(NULL, new_cmo_int32(row), new_cmo_int32(col), NULL); + + for (i = 0; i < row; i++) { + for (j = 0; j < col; j++) { + zz = ZZ_to_cmo_zz(mat[i][j]); + list_append(list, (cmo *)zz); + } + } + UNBLOCK_NEW_CMO(); + + return (list); +} + + + + +/**************************************************************************** + * convert cmo to ZZX which is polynomial in Z[x] + * + * PARAM : O : f : polynomial in Z[x] + * : I : m : cmo. + * : O : x : indeterminate + * RETURN: success : NTL_SUCCESS + * : failure : NTL_FAILURE + ****************************************************************************/ int +cmo_to_mat_zz(mat_ZZ &mat, cmo *m) +{ + cmo_list *list; + int ret; + ZZ row, col, size; + int len; + cell *el; + int i, j; + int c, r; + + if (m->tag != CMO_LIST) { + return (NTL_FAILURE); + } + + list = (cmo_list *)m; + len = list_length(list); + + if (len < 2) { + return (NTL_FAILURE); + } + + el = list_first(list); + ret = cmo_to_ZZ(row, el->cmo); + if (ret != NTL_SUCCESS) { + return (ret); + } + + el = list_next(el); + ret = cmo_to_ZZ(col, el->cmo); + if (ret != NTL_SUCCESS) { + return (ret); + } + + mul(size, row, col); + + if (len - 2 != size) { + return (NTL_FAILURE); + } + + /* row and col is less than INT_MAX */ + r = to_int(row); + c = to_int(col); + mat.SetDims(r, c); + for (i = 0; i < r; i++) { + for (j = 0; j < c; j++) { + el = list_next(el); + ret = cmo_to_ZZ(mat[i][j], el->cmo); + if (ret) { + return (ret); + } + } + } + return (NTL_SUCCESS); +} + + + +/**************************************************************************** + * convert cmo to ZZX which is polynomial in Z[x] + * + * PARAM : O : f : polynomial in Z[x] + * : I : m : cmo. + * : O : x : indeterminate + * RETURN: success : NTL_SUCCESS + * : failure : NTL_FAILURE + ****************************************************************************/ +int cmo_to_ZZX(ZZX &f, cmo *m, cmo_indeterminate *&x) { char *str; @@ -218,7 +340,7 @@ cmo_to_ZZX(ZZX &f, cmo *m, cmo_indeterminate *&x) return (NTL_FAILURE); } { - istrstream sin(str, strlen(str)); + std::istringstream sin(str); sin >> f; } break; @@ -227,14 +349,12 @@ cmo_to_ZZX(ZZX &f, cmo *m, cmo_indeterminate *&x) 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; @@ -265,6 +385,8 @@ cmo_to_ZZX(ZZX &f, cmo *m, cmo_indeterminate *&x) return (NTL_SUCCESS); } + + /**************************************************************************** * convert polynomial in Z[x] to cmo_recursive_polynomial * @@ -282,6 +404,8 @@ ZZX_to_cmo(ZZX &factor, cmo_indeterminate *x) int i; cmo *coef; + BLOCK_NEW_CMO(); + ringdef = new_cmo_list(); list_append(ringdef, (cmo *)x); @@ -295,6 +419,9 @@ ZZX_to_cmo(ZZX &factor, cmo_indeterminate *x) } rec = new_cmo_recursive_polynomial(ringdef, (cmo *)poly); + + UNBLOCK_NEW_CMO(); + return (rec); } @@ -315,10 +442,14 @@ ZZX_int_to_cmo(ZZX &factor, int d, cmo_indeterminate * cmo_list *list; poly = ZZX_to_cmo(factor, x); - deg = new_cmo_int32(d); + BLOCK_NEW_CMO(); + + deg = new_cmo_int32(d); list = list_appendl(NULL, poly, deg, NULL); + UNBLOCK_NEW_CMO(); + return (list); } @@ -336,15 +467,88 @@ cmo_list * vec_pair_ZZX_long_to_cmo(vec_pair_ZZX_long &factors, cmo_indeterminate *x) { int i; - cmo_list *list = new_cmo_list(); + cmo_list *list; cmo_list *factor; + BLOCK_NEW_CMO(); + + list = new_cmo_list(); for (i = 0; i < factors.length(); i++) { factor = ZZX_int_to_cmo(factors[i].a, (int)factors[i].b, x); list_append(list, (cmo *)factor); } + UNBLOCK_NEW_CMO(); + return (list); } + + +/**************************************************************************** + * convert local object to cmo. + * for SM_popCMO + * + * PARAM : I : p : cmo + * RETURN: cmo + ****************************************************************************/ +cmo * +convert_cmon(cmo *p) +{ + switch (p->tag) { + case CMON_ZZ: + { + cmon_zz_t *z = (cmon_zz_t *)p; + return ((cmo *)ZZ_to_cmo_zz(*z->z)); + } + case CMON_ZZX: + { + cmon_zzx_t *f = (cmon_zzx_t *)p; + return ((cmo *)ZZX_to_cmo(*f->f, f->x)); + } + case CMON_FACTORS: + { + cmon_factors_t *f = (cmon_factors_t *)p; + cmo_zz *z = ZZ_to_cmo_zz(*f->cont); + cmo_list *list = vec_pair_ZZX_long_to_cmo(*f->f, f->x); + return ((cmo *)list_appendl(NULL, (cmo *)z, list, NULL)); + } + case CMON_MAT_ZZ: + { + cmon_mat_zz_t *m = (cmon_mat_zz_t *)p; + cmo_list *list = mat_zz_to_cmo(*m->mat); + return ((cmo *)list); + } + default: + return (p); + } +} + + + +/**************************************************************************** + * convert tag of local object to tag of cmo. + * for SM_pushCMOtag + * + * PARAM : I : p : cmo + * RETURN: tag + ****************************************************************************/ +int +get_cmon_tag(cmo *p) +{ + switch (p->tag) { + case CMON_ZZ: + return (CMO_ZZ); + case CMON_ZZX: + return (CMO_RECURSIVE_POLYNOMIAL); + case CMON_FACTORS: + return (CMO_LIST); + case CMON_MAT_ZZ: + return (CMON_MAT_ZZ); + default: + return (p->tag); + } +} + +