Annotation of OpenXM_contrib2/asir2018/engine/num.c, Revision 1.1
1.1 ! noro 1: /*
! 2: * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
! 3: * All rights reserved.
! 4: *
! 5: * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
! 6: * non-exclusive and royalty-free license to use, copy, modify and
! 7: * redistribute, solely for non-commercial and non-profit purposes, the
! 8: * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
! 9: * conditions of this Agreement. For the avoidance of doubt, you acquire
! 10: * only a limited right to use the SOFTWARE hereunder, and FLL or any
! 11: * third party developer retains all rights, including but not limited to
! 12: * copyrights, in and to the SOFTWARE.
! 13: *
! 14: * (1) FLL does not grant you a license in any way for commercial
! 15: * purposes. You may use the SOFTWARE only for non-commercial and
! 16: * non-profit purposes only, such as academic, research and internal
! 17: * business use.
! 18: * (2) The SOFTWARE is protected by the Copyright Law of Japan and
! 19: * international copyright treaties. If you make copies of the SOFTWARE,
! 20: * with or without modification, as permitted hereunder, you shall affix
! 21: * to all such copies of the SOFTWARE the above copyright notice.
! 22: * (3) An explicit reference to this SOFTWARE and its copyright owner
! 23: * shall be made on your publication or presentation in any form of the
! 24: * results obtained by use of the SOFTWARE.
! 25: * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
! 26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
! 27: * for such modification or the source code of the modified part of the
! 28: * SOFTWARE.
! 29: *
! 30: * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
! 31: * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
! 32: * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
! 33: * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
! 34: * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
! 35: * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
! 36: * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
! 37: * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
! 38: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
! 39: * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
! 40: * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
! 41: * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
! 42: * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
! 43: * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
! 44: * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
! 45: * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
! 46: * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
! 47: *
! 48: * $OpenXM$
! 49: */
! 50: #include "ca.h"
! 51:
! 52: void addnum(VL vl,Num a,Num b,Num *c)
! 53: {
! 54: (*addnumt[MAX(a?NID(a):0,b?NID(b):0)])(a,b,c);
! 55: }
! 56:
! 57: void subnum(VL vl,Num a,Num b,Num *c)
! 58: {
! 59: (*subnumt[MAX(a?NID(a):0,b?NID(b):0)])(a,b,c);
! 60: }
! 61:
! 62: void mulnum(VL vl,Num a,Num b,Num *c)
! 63: {
! 64: (*mulnumt[MAX(a?NID(a):0,b?NID(b):0)])(a,b,c);
! 65: }
! 66:
! 67: void divnum(VL vl,Num a,Num b,Num *c)
! 68: {
! 69: (*divnumt[MAX(a?NID(a):0,b?NID(b):0)])(a,b,c);
! 70: }
! 71:
! 72: void pwrnum(VL vl,Num a,Num b,Num *c)
! 73: {
! 74: (*pwrnumt[MAX(a?NID(a):0,b?NID(b):0)])(a,b,c);
! 75: }
! 76:
! 77: void chsgnnum(Num a,Num *c)
! 78: {
! 79: (*chsgnnumt[a?NID(a):0])(a,c);
! 80: }
! 81:
! 82: int compnum(VL vl,Num a,Num b)
! 83: {
! 84: return (*cmpnumt[MAX(a?NID(a):0,b?NID(b):0)])(a,b);
! 85: }
! 86:
! 87: extern int current_ff;
! 88:
! 89: void one_ff(Num *c)
! 90: {
! 91: LM lm;
! 92: GFS fs;
! 93: GFSN fspn;
! 94:
! 95: switch ( current_ff ) {
! 96: case FF_GFP:
! 97: case FF_GFPN:
! 98: *c = (Num)ONELM;
! 99: break;
! 100: case FF_GFS:
! 101: mqtogfs(ONEM,&fs);
! 102: *c = (Num)fs;
! 103: break;
! 104: case FF_GFSN:
! 105: ntogfsn((Obj)ONE,&fspn);
! 106: *c = (Num)fspn;
! 107: break;
! 108: default:
! 109: error("one_ff : not implemented yet");
! 110: }
! 111: }
! 112:
! 113: int negative_number(Num c)
! 114: {
! 115: if ( !c )
! 116: return 0;
! 117: else {
! 118: switch ( NID(c) ) {
! 119: case N_Q:
! 120: return sgnq((Q)c)<0;
! 121: case N_R:
! 122: return BDY((Real)c)<0;
! 123: case N_B:
! 124: return 0; /* XXX */
! 125: default:
! 126: return 0;
! 127: }
! 128: }
! 129: }
! 130:
! 131: /* general simplifier for finite field elements */
! 132: /* XXX : we don't have appropriate file */
! 133:
! 134: void simp_ff(Obj p,Obj *rp)
! 135: {
! 136: LM s;
! 137: DCP dc,dcr0,dcr;
! 138: GF2N rg,sg;
! 139: GFPN rpn,spn;
! 140: GFS rs;
! 141: GFSN rspn,sspn;
! 142: P t;
! 143: Obj obj;
! 144:
! 145: lm_lazy = 0;
! 146: if ( !p )
! 147: *rp = 0;
! 148: else if ( OID(p) == O_N ) {
! 149: switch ( current_ff ) {
! 150: case FF_GFP:
! 151: ptolmp((P)p,&t); simplm((LM)t,&s); *rp = (Obj)s;
! 152: break;
! 153: case FF_GF2N:
! 154: ptogf2n((Obj)p,&rg); simpgf2n((GF2N)rg,&sg); *rp = (Obj)sg;
! 155: break;
! 156: case FF_GFPN:
! 157: ntogfpn((Obj)p,&rpn); simpgfpn((GFPN)rpn,&spn); *rp = (Obj)spn;
! 158: break;
! 159: case FF_GFS:
! 160: if ( NID((Num)p) == N_GFS )
! 161: *rp = p;
! 162: else {
! 163: ptomp(current_gfs_p,(P)p,&t); mqtogfs((MQ)t,&rs);
! 164: *rp = (Obj)rs;
! 165: }
! 166: break;
! 167: case FF_GFSN:
! 168: ntogfsn((Obj)p,&rspn); simpgfsn((GFSN)rspn,&sspn);
! 169: *rp = (Obj)sspn;
! 170: break;
! 171: default:
! 172: *rp = (Obj)p;
! 173: break;
! 174: }
! 175: } else if ( OID(p) == O_P ) {
! 176: for ( dc = DC((P)p), dcr0 = 0; dc; dc = NEXT(dc) ) {
! 177: simp_ff((Obj)COEF(dc),&obj);
! 178: if ( obj ) {
! 179: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = (P)obj;
! 180: }
! 181: }
! 182: if ( !dcr0 )
! 183: *rp = 0;
! 184: else {
! 185: NEXT(dcr) = 0; MKP(VR((P)p),dcr0,t); *rp = (Obj)t;
! 186: }
! 187: } else
! 188: error("simp_ff : not implemented yet");
! 189: }
! 190:
! 191:
! 192: void field_order_ff(Z *order)
! 193: {
! 194: UP2 up2;
! 195: UP up;
! 196: UM dp;
! 197: Z m,e;
! 198: mpz_t z;
! 199: int d,w;
! 200:
! 201: switch ( current_ff ) {
! 202: case FF_GFP:
! 203: getmod_lm(order); break;
! 204: case FF_GF2N:
! 205: getmod_gf2n(&up2); d = degup2(up2);
! 206: mpz_init(z);
! 207: mpz_mul_2exp(z,BDY(ONE),d);
! 208: MPZTOZ(z,*order);
! 209: break;
! 210: case FF_GFPN:
! 211: getmod_lm(&m);
! 212: getmod_gfpn(&up);
! 213: STOQ(up->d,e);
! 214: pwrz(m,e,order);
! 215: break;
! 216: case FF_GFS:
! 217: STOQ(current_gfs_q,*order); break;
! 218: case FF_GFSN:
! 219: STOQ(current_gfs_q,m);
! 220: getmod_gfsn(&dp);
! 221: STOQ(DEG(dp),e);
! 222: pwrz(m,e,order);
! 223: break;
! 224: default:
! 225: error("field_order_ff : current_ff is not set");
! 226: }
! 227: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>