version 1.35, 2013/10/20 14:58:20 |
version 1.39, 2015/08/04 07:41:49 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.34 2007/03/14 10:30:54 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.38 2015/08/04 05:24:44 noro Exp $ */ |
|
|
/* |
/* |
This module includes functions for sending/receiveng CMO's. |
This module includes functions for sending/receiveng CMO's. |
|
|
#include <sys/file.h> |
#include <sys/file.h> |
#include <time.h> |
#include <time.h> |
|
|
|
#include <mpfr.h> |
|
/* XXX : defined in mpfr-impl.h */ |
|
#define MPFR_PREC(x) ((x)->_mpfr_prec) |
|
#define MPFR_EXP(x) ((x)->_mpfr_exp) |
|
#define MPFR_MANT(x) ((x)->_mpfr_d) |
|
#define MPFR_LAST_LIMB(x) ((MPFR_PREC (x) - 1) / GMP_NUMB_BITS) |
|
#define MPFR_LIMB_SIZE(x) (MPFR_LAST_LIMB (x) + 1) |
|
|
|
#if SIZEOF_LONG==4 |
|
typedef long long L64; |
|
typedef unsigned long long UL64; |
|
#else |
|
typedef long L64; |
|
typedef unsigned long UL64; |
|
#endif |
|
|
#include "mysocket.h" |
#include "mysocket.h" |
#include "ox_toolkit.h" |
#include "ox_toolkit.h" |
#include "parse.h" |
#include "parse.h" |
Line 54 static cmo_zz* receive_cmo_zz(OXFILE *oxfp); |
|
Line 70 static cmo_zz* receive_cmo_zz(OXFILE *oxfp); |
|
static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz); |
static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz); |
static int send_cmo_zz(OXFILE *oxfp, cmo_zz* c); |
static int send_cmo_zz(OXFILE *oxfp, cmo_zz* c); |
static int send_mpz(OXFILE *oxfp, mpz_ptr mpz); |
static int send_mpz(OXFILE *oxfp, mpz_ptr mpz); |
|
static void receive_mpfr(OXFILE *oxfp, mpfr_ptr mpfr); |
|
static int send_mpfr(OXFILE *oxfp, mpfr_ptr mpfr); |
|
|
/* hook functions. (yet not implemented) */ |
/* hook functions. (yet not implemented) */ |
static hook_t hook_before_send_cmo = NULL; |
static hook_t hook_before_send_cmo = NULL; |
Line 218 static cmo_qq* receive_cmo_qq(OXFILE *oxfp) |
|
Line 236 static cmo_qq* receive_cmo_qq(OXFILE *oxfp) |
|
return new_cmo_qq_set_mpz(num, den); |
return new_cmo_qq_set_mpz(num, den); |
} |
} |
|
|
|
static cmo_bf* receive_cmo_bf(OXFILE *oxfp) |
|
{ |
|
mpfr_t num; |
|
mpfr_init(num); |
|
receive_mpfr(oxfp, num); |
|
return new_cmo_bf_set_mpfr(num); |
|
} |
|
|
static cmo_zero* receive_cmo_zero(OXFILE *oxfp) |
static cmo_zero* receive_cmo_zero(OXFILE *oxfp) |
{ |
{ |
return new_cmo_zero(); |
return new_cmo_zero(); |
Line 342 cmo *receive_cmo_tag(OXFILE *oxfp, int tag) |
|
Line 368 cmo *receive_cmo_tag(OXFILE *oxfp, int tag) |
|
case CMO_QQ: |
case CMO_QQ: |
m = (cmo *)receive_cmo_qq(oxfp); |
m = (cmo *)receive_cmo_qq(oxfp); |
break; |
break; |
|
case CMO_BIGFLOAT: |
|
m = (cmo *)receive_cmo_bf(oxfp); |
|
break; |
case CMO_ZERO: |
case CMO_ZERO: |
m = (cmo *)receive_cmo_zero(oxfp); |
m = (cmo *)receive_cmo_zero(oxfp); |
break; |
break; |
Line 387 cmo *receive_cmo_tag(OXFILE *oxfp, int tag) |
|
Line 416 cmo *receive_cmo_tag(OXFILE *oxfp, int tag) |
|
static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz) |
static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz) |
{ |
{ |
int i; |
int i; |
int n = sizeof(mpz->_mp_d[0]) / sizeof(int); |
int n = sizeof(mpz->_mp_d[0]) / sizeof(int); |
int size = receive_int32(oxfp); |
int size = receive_int32(oxfp); |
int len = abs(size); |
int len = abs(size); |
int *ptr; |
int *ptr; |
if (n == 1) { |
if (n == 1) { |
resize_mpz(mpz, size); |
resize_mpz(mpz, size); |
} else { |
} else if (size >= 0) { |
resize_mpz(mpz, (size+1) / n); |
resize_mpz(mpz, (size+1) / n); |
} |
} else { |
|
resize_mpz(mpz, (size-1) / n); |
|
} |
|
|
ptr = (int *)mpz->_mp_d; |
ptr = (int *)mpz->_mp_d; |
for(i= len-1; i>=0; i--) { |
for(i=0; i<len; i++) { |
ptr[i] = receive_int32(oxfp); |
ptr[i] = receive_int32(oxfp); |
} |
} |
} |
} |
|
|
void send_ox_command(OXFILE *oxfp, int sm_command) |
void send_ox_command(OXFILE *oxfp, int sm_command) |
Line 619 static int send_cmo_qq(OXFILE *oxfp, cmo_qq* c) |
|
Line 650 static int send_cmo_qq(OXFILE *oxfp, cmo_qq* c) |
|
return 0; |
return 0; |
} |
} |
|
|
|
static int send_cmo_bf(OXFILE *oxfp, cmo_bf* c) |
|
{ |
|
send_mpfr(oxfp, c->mpfr); |
|
return 0; |
|
} |
|
|
static int send_cmo_recursive_polynomial(OXFILE *oxfp, cmo_recursive_polynomial* c) |
static int send_cmo_recursive_polynomial(OXFILE *oxfp, cmo_recursive_polynomial* c) |
{ |
{ |
send_cmo(oxfp, (cmo *)c->ringdef); |
send_cmo(oxfp, (cmo *)c->ringdef); |
Line 685 void send_cmo(OXFILE *oxfp, cmo* c) |
|
Line 722 void send_cmo(OXFILE *oxfp, cmo* c) |
|
case CMO_QQ: |
case CMO_QQ: |
send_cmo_qq(oxfp, (cmo_qq *)c); |
send_cmo_qq(oxfp, (cmo_qq *)c); |
break; |
break; |
|
case CMO_BIGFLOAT: |
|
send_cmo_bf(oxfp, (cmo_bf *)c); |
|
break; |
case CMO_DISTRIBUTED_POLYNOMIAL: |
case CMO_DISTRIBUTED_POLYNOMIAL: |
send_cmo_distributed_polynomial(oxfp, (cmo_distributed_polynomial *)c); |
send_cmo_distributed_polynomial(oxfp, (cmo_distributed_polynomial *)c); |
break; |
break; |
Line 715 static int send_mpz(OXFILE *oxfp, mpz_ptr mpz) |
|
Line 755 static int send_mpz(OXFILE *oxfp, mpz_ptr mpz) |
|
int n = sizeof(mpz->_mp_d[0]) / sizeof(int); |
int n = sizeof(mpz->_mp_d[0]) / sizeof(int); |
int len = abs(mpz->_mp_size) * n; |
int len = abs(mpz->_mp_size) * n; |
int *ptr = (int *)mpz->_mp_d; |
int *ptr = (int *)mpz->_mp_d; |
send_int32(oxfp, mpz->_mp_size * n); |
int size; |
|
if (len > 0 && ptr[len-1] == 0) { |
|
len--; |
|
} |
|
size = mpz->_mp_size < 0 ? -len : len; |
|
send_int32(oxfp, size); |
for(i=0; i<len; i++) { |
for(i=0; i<len; i++) { |
send_int32(oxfp, ptr[i]); |
send_int32(oxfp, ptr[i]); |
} |
} |
|
return 0; |
|
} |
|
|
|
void send_int64(OXFILE *oxfp,UL64 a) |
|
{ |
|
send_int32(oxfp, a>>32); |
|
send_int32(oxfp, a&0xffffffff); |
|
} |
|
|
|
UL64 receive_int64(OXFILE *oxfp) |
|
{ |
|
UL64 u,l; |
|
|
|
u = receive_int32(oxfp); |
|
l = receive_int32(oxfp); |
|
return (u<<32)|l; |
|
} |
|
|
|
static void receive_mpfr(OXFILE *oxfp, mpfr_ptr mpfr) |
|
{ |
|
int sgn,prec,len,i; |
|
long *ptr; |
|
L64 exp; |
|
|
|
sgn = receive_int32(oxfp); |
|
prec = receive_int32(oxfp); |
|
exp = receive_int64(oxfp); |
|
/* len = length as an int array (int = 4bytes) */ |
|
len = receive_int32(oxfp); |
|
|
|
mpfr_init2(mpfr,prec); |
|
MPFR_SIGN(mpfr) = sgn; |
|
ptr = mpfr->_mpfr_d; |
|
mpfr->_mpfr_exp = exp; |
|
#if SIZEOF_LONG==4 |
|
for ( i = 0; i < len; i++ ) |
|
ptr[i] = receive_int32(oxfp); |
|
#else |
|
len >>= 1; |
|
for ( i = 0; i < len; i++ ) |
|
ptr[i] = receive_int64(oxfp); |
|
#endif |
|
} |
|
|
|
static int send_mpfr(OXFILE *oxfp, mpfr_ptr mpfr) |
|
{ |
|
|
|
int i,len; |
|
long *ptr; |
|
|
|
send_int32(oxfp, MPFR_SIGN(mpfr)); |
|
send_int32(oxfp, MPFR_PREC(mpfr)); |
|
send_int64(oxfp, MPFR_EXP(mpfr)); |
|
len = MPFR_LIMB_SIZE(mpfr); |
|
ptr = MPFR_MANT(mpfr); |
|
#if SIZEOF_LONG==4 |
|
send_int32(oxfp, len); |
|
for ( i = 0; i < len; i++ ) |
|
send_int32(oxfp,ptr[i]); |
|
#else /* SIZEOF_LONG==8 */ |
|
send_int32(oxfp, 2*len); |
|
for ( i = 0; i < len; i++ ) |
|
send_int64(oxfp,ptr[i]); |
|
#endif |
return 0; |
return 0; |
} |
} |
|
|