Changeset 6a1aa7 in git


Ignore:
Timestamp:
Jul 11, 2014, 5:08:34 PM (9 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', '8e0ad00ce244dfd0756200662572aef8402f13d5')
Children:
1234c77ed4ce613f813076f72fa15a303743e451312a931ca75e1ecf46c185282254d34874f9f4a4
Parents:
653440a090c5b7f2086e19c2cadf27bb08f91644
git-author:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2014-07-11 17:08:34+02:00
git-committer:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2014-07-11 17:09:41+02:00
Message:
preparation for more integer representations

n_Init_bigint: substituted by n_setMap/nMap
introduced cf->rep for different data representation
introduced several (experimental) integer variants
   via #define in libpolys/misc/auxiliary.h.in
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • Singular/iparith.cc

    r653440 r6a1aa7  
    10181018static BOOLEAN jjTIMES_MA_BI1(leftv res, leftv u, leftv v)
    10191019{
    1020   number n=n_Init_bigint((number)v->Data(),coeffs_BIGINT,currRing->cf);
     1020  nMapFunc nMap=n_SetMap(coeffs_BIGINT,currRing->cf);
     1021  if (nMap==NULL) return TRUE;
     1022  number n=nMap((number)v->Data(),coeffs_BIGINT,currRing->cf);
    10211023  poly p=pNSet(n);
    10221024  ideal I= (ideal)mp_MultP((matrix)u->CopyD(MATRIX_CMD),p,currRing);
     
    17271729static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v)
    17281730{
     1731  coeffs cf;
    17291732  lists c=(lists)u->CopyD(); // list of ideal or bigint/int
    17301733  lists pl=NULL;
     
    17521755      return_type=BIGINT_CMD;
    17531756  }
     1757  if (return_type==BIGINT_CMD)
     1758    cf=coeffs_BIGINT;
     1759  else
     1760  {
     1761    cf=currRing->cf;
     1762    if (nCoeff_is_Extension(cf) && (cf->extRing!=NULL))
     1763      cf=cf->extRing->cf;
     1764  }
     1765  nMapFunc nMap=n_SetMap(coeffs_BIGINT,cf);
    17541766  if (return_type!=BIGINT_CMD)
    17551767  {
     
    17771789  {
    17781790    xx=(number *)omAlloc(rl*sizeof(number));
     1791    if (nMap==NULL)
     1792    {
     1793      Werror("not implemented: map bigint -> %s",cf->cfCoeffString(cf));
     1794      return TRUE;
     1795    }
    17791796    for(i=rl-1;i>=0;i--)
    17801797    {
    17811798      if (c->m[i].Typ()==INT_CMD)
    17821799      {
    1783         xx[i]=n_Init(((int)(long)c->m[i].Data()),coeffs_BIGINT);
     1800        xx[i]=n_Init(((int)(long)c->m[i].Data()),cf);
    17841801      }
    17851802      else if (c->m[i].Typ()==BIGINT_CMD)
    17861803      {
    1787         xx[i]=(number)c->m[i].Data();
     1804        xx[i]=nMap((number)c->m[i].Data(),coeffs_BIGINT,cf);
    17881805      }
    17891806      else
     
    18011818    for(i=rl-1;i>=0;i--)
    18021819    {
    1803       q[i]=n_Init((*p)[i], coeffs_BIGINT);
     1820      q[i]=n_Init((*p)[i], cf);
    18041821    }
    18051822  }
     
    18101827      if (pl->m[i].Typ()==INT_CMD)
    18111828      {
    1812         q[i]=n_Init((int)(long)pl->m[i].Data(),coeffs_BIGINT);
     1829        q[i]=n_Init((int)(long)pl->m[i].Data(),cf);
    18131830      }
    18141831      else if (pl->m[i].Typ()==BIGINT_CMD)
    18151832      {
    1816         q[i]=n_Copy((number)(pl->m[i].Data()),coeffs_BIGINT);
     1833        q[i]=nMap((number)(pl->m[i].Data()),coeffs_BIGINT,cf);
    18171834      }
    18181835      else
     
    18211838        for(i++;i<rl;i++)
    18221839        {
    1823           n_Delete(&(q[i]),coeffs_BIGINT);
     1840          n_Delete(&(q[i]),cf);
    18241841        }
    18251842        omFree(x); // delete c
     
    18511868  for(i=rl-1;i>=0;i--)
    18521869  {
    1853     n_Delete(&(q[i]),coeffs_BIGINT);
     1870    n_Delete(&(q[i]),cf);
    18541871  }
    18551872  omFree(q);
     
    22252242    int par_perm_size=0;
    22262243    BOOLEAN bo;
    2227     //if (!nSetMap(rInternalChar(r),r->parameter,rPar(r),r->minpoly))
    22282244    if ((nMap=n_SetMap(r->cf,currRing->cf))==NULL)
    22292245    {
     
    23122328  return TRUE;
    23132329err_fetch:
    2314   Werror("no identity map from %s",u->Fullname());
     2330  Werror("no identity map from %s (%s -> %s)",u->Fullname(),
     2331    r->cf->cfCoeffString(r->cf),
     2332    currRing->cf->cfCoeffString(currRing->cf));
    23152333  return TRUE;
    23162334}
     
    67246742      {
    67256743        number b=(number)h->Data();
    6726         number n=n_Init_bigint(b,coeffs_BIGINT,currRing->cf);
     6744        nMapFunc nMap=n_SetMap(coeffs_BIGINT,currRing->cf);
     6745        if (nMap==NULL) return TRUE;
     6746        number n=nMap(b,coeffs_BIGINT,currRing->cf);
    67276747        if (!nIsZero(n))
    67286748        {
  • Singular/ipconv.cc

    r653440 r6a1aa7  
    5555static void * iiBI2P(void *data)
    5656{
    57   number n=n_Init_bigint((number)data, coeffs_BIGINT /*currRing->cf*/, currRing->cf);
     57  nMapFunc nMap=n_SetMap(coeffs_BIGINT,currRing->cf);
     58  if (nMap==NULL)
     59  {
     60    Werror("no conversion from bigint to %s",currRing->cf->cfCoeffString(currRing->cf));
     61    return NULL;
     62  }
     63  number n=nMap((number)data,coeffs_BIGINT,currRing->cf);
    5864  n_Delete((number *)&data, coeffs_BIGINT);
    5965  poly p=p_NSet(n, currRing);
     
    7076static void * iiBI2V(void *data)
    7177{
    72   number n=n_Init_bigint((number)data, coeffs_BIGINT/*currRing->cf*/, currRing->cf);
     78  nMapFunc nMap=n_SetMap(coeffs_BIGINT,currRing->cf);
     79  if (nMap==NULL)
     80  {
     81    Werror("no conversion from bigint to %s",currRing->cf->cfCoeffString(currRing->cf));
     82    return NULL;
     83  }
     84  number n=nMap((number)data,coeffs_BIGINT,currRing->cf);
    7385  n_Delete((number *)&data, coeffs_BIGINT);
    7486  poly p=p_NSet(n, currRing);
     
    8799{
    88100  ideal I=idInit(1,1);
    89   number n=n_Init_bigint((number)data, coeffs_BIGINT, currRing->cf);
     101  nMapFunc nMap=n_SetMap(coeffs_BIGINT,currRing->cf);
     102  if (nMap==NULL)
     103  {
     104    Werror("no conversion from bigint to %s",currRing->cf->cfCoeffString(currRing->cf));
     105    return NULL;
     106  }
     107  number n=nMap((number)data,coeffs_BIGINT,currRing->cf);
    90108  n_Delete((number *)&data,coeffs_BIGINT);
    91109  poly p=pNSet(n);
     
    165183{
    166184  if (currRing==NULL) return NULL;
    167   // a bigint is really a number from char 0, with diffrent
    168   // operations...
    169   number n = n_Init_bigint((number)data, coeffs_BIGINT, currRing->cf);
     185  nMapFunc nMap=n_SetMap(coeffs_BIGINT,currRing->cf);
     186  if (nMap==NULL)
     187  {
     188    Werror("no conversion from bigint to %s",currRing->cf->cfCoeffString(currRing->cf));
     189    return NULL;
     190  }
     191  number n=nMap((number)data,coeffs_BIGINT,currRing->cf);
    170192  n_Delete((number *)&data, coeffs_BIGINT);
    171193  return (void*)n;
  • Tst/Short/imap.res.gz.uu

    r653440 r6a1aa7  
    1 begin 644 imap.res.gz
    2 M'XL("//+YU(``VEM87`N<F5S`,V=7W/CMA'`W^]3<#)]\-7.!=C%'^(R=YWI
    3 M]"5MIR_7]T1*K-0S/MN1>*WT[0M*(D&3H+BP`)`/.<NTC5WL@KO`_@#DR[__
    4 M]M._BJ+@GXM__O37XKMJ5WUX?%A_]^.[+^>?P.?"/OSYX>FANGG_8_'\4CT\
    5 M/]W\]'7U\O['=_73XO/GXL%^^^'I_G\?=M6J:O\4/Q?M9_&AV#X\_5YL6?&I
    6 M8'?%S>IN?;>_.[R_*QY?G#3YN7AY?CP4+_:W>'%;K.K_P/ZSKC\<_]G7_QSJ
    7 M1_6G^K_ZF_WAQ\*VLX+;U?IVM;]='6Y7M^O][?IV?[C=WQYN>2M#==32C5K<
    8 M"KRQ>JVL0C?KNV)_5_1U*Z_4S6ISL[KE[_]\U.GTL7E4?V]5MQ];<<:IR5FC
    9 M)C1JWA7K6M.AFIQ?J>9)M[5'N_7MZ7DK"CHJXEG%7>U@!,9PS,E<I'<REQW5
    10 M5*/:T<EGW<8=S7561_.RHZII5(6NJG<CO@:6S=?`G98`9RVKVM=ZS,^`Z?T,
    11 MHJ.6;-0Z^EE?\C&HK#X&W5&S;-2$1LU1_YIL_D7F-$1^UG##VJA8]"U9?'UX
    12 M.NKVZ:01;[5&2&Q;IW0GPV"383;.^R%*7YMYZ$IW\@\V^6=S'`O"7!JS&"$!
    13 MK>1)/_OU^(W])'0KH)-RA$TY[6?>^6S?_=U]=<[EK6X"3Y.`FZT=+?7,X(<?
    14 MBO^NML7J8_&TM<I^__GXM7F\/CZ&\V-H'N^/C_'\&)O'A^-C<7XL*'%!B),^
    15 MQ<V6OU)H_4JAGF3P2\96LGW\<NI5_<5UBZ*1;"P$KQ3:OU*H)QDF)9^?KT_/
    16 MG44I&JFS1KN%^$PW/MN=?69G07\IGIZ+A]_NGZJ'ZE#4/]ULG[_:5'[ZX?UV
    17 M^[PMGG_]]=MV>_];\?!4V&_7]YOG[7UQ:O;QX>G>-OVQ^.55V[^T4LO&"C`I
    18 M%,*$EF>A3=-.ICG+K)9A><D:RU>3EJ_"+"]9:_FJ9WG)&RM,6KX*L[SDC>6K
    19 MGN4EG&5N)F5N`F5"(W/3E]G$QLVD<3>!QL569M^VHI')<H0_[_AJ=>G,Q:7J
    20 MI`^7?:6>3!]'B?XW@OO?"/"_$1@X=Y,E*95PORW!;\M@)0PE>X`_>V#'<0-S
    21 M>K('#U1.L<E$,IOW%.\GE1F\IR!5CE$PEF,43N:8^9PB^OEF#J?(5.E'R;'T
    22 MHU2J]*/46/I1NI=^LMC:F;FD9*)TXCMK&LTZR0?:Y*/YFY//,6KZ7Q7N?U4@
    23 M8$VN83KS>#08O,.'WCL<H`%2T@[WIYT@0>+-*22Q#^1T_DCL`]5+'LE\H-^<
    24 M,1+[H)Q.%XE]8'JY(I4/2I8J091L+$&4?#)!1+3NL<>NOS"9'=+)[E0/2^%2
    25 MP\Z5M4HYF1JR+M1+M;2R5JDI&2)G6:LL)U-)7I\9T@HDH\\,HV24G#XS?#+U
    26 M9/69@7[&B580,S!:$#.8:D5B<&Q%8D2JA&/$6,(QLI=PHA7$C!PKB!E%68;D
    27 M*8B9#@TT92?QN(*8,6]>DPQ74W%7[YPQ4A)*NGKGC%/RSCP%,<[@S:N9]-[#
    28 M^0MBG`E*!IK+>_+-ZZ#TWE/32Z'TWM.I\I1M>B11<5:F2E2VZ9%,Q9F97!HE
    29 ML'9K:,XH22N=>+?GA_,.]]^UM3/.I[G_+#4#S@D;`)+6##@G`?_K:P:<3W/\
    30 MF7PP`/K9?="'^\E\,$WTY_$!#-!^;A]`'_.G\@$D8_NVZ;$,`7VXGZ^`Q6$:
    31 M\J>3[:`^AP[4K]KB&8=IJ/_D?R6&*[$(BWH.-)"?KQ##@43U,Q9B.$ZC_*P^
    32 MPP&^C[8GS+8]MBF,8S)@;YL>(?8<IXE]7MO3*'W&]P7[R'[^]R49T+=-C^4<
    33 M)!']++4LCB2\GTD7Q_JYZ+#^JJVK<?%VUC]<:45>VPL"[A\J$7EM+TC$?Z;*
    34 MC'C[+H'TWB-L%$COO?Y>@7AY2ZBQO"7>OF\@O5<(6P?2>X6T>V"F=THFVW'`
    35 MY=B6`RZGMQPD\(KK\_2N@Z3BW<8#+CL;#RI75Y/3&P_FJ2=(P@Z$M/4$2=IQ
    36 M$*&>(*<W$LSD`\*.@K0^4*0=!!%\H*8W!LSC`S78(9#=!_W=`LE\D&R+@&UZ
    37 M+$.H_AZ!C+4M-;U7()ULMS>`J\[>@(W+#:J_-V#<'UL6Z`_3^./<=NL//8#^
    38 M%Z0&%F*T.R.V[15B=!_S7Y`:./9T>TALVQM[NH_O+\RB`PVL7?6G;^`!EX]7
    39 MZ=(X6NG2?1(?;\6@Q=B*0?<(>Q%M:3"LT.@!,8^VE<NV/;:7B^MTC%R/,G+=
    40 M9^2QYK67CHUSW8?DT;9SV:9']G/QLH_&+P@-?$<[.Z5[[VC9`>)E!XAO7(&I
    41 M?#L03[`8;M-*23L/GVS)4Y)@>+8EL-/K[>P\J;L(Y#RINY(=BK=-CV6%\NT,
    42 M/:4O#(&@I_2%(?'S_*^.28?;S2AN-].X/:DO2,?JTXGO0'?3@>X;!]W-HD[2
    43 M.\WG.43OY"_K_'RC%[!%'9UW:LUS:M[)3\;?;=,C^0?8HD[,.UO,<UC>R4]V
    44 M3MXV/;*2`9:,J]NF1Y(+L%E/R@.;]:0\,$?/@3/?+5]0;PC>W%>__J>?7:PD
    45 MNVA:U4)7G6?\8[&NGZT[S^SKMZ^?[3O/\&-QJ)\="%LNH+YU\JC$()><M%A[
    46 MM-A[M#B<M#C5WXZ".C*P[2AX1.P](@XG$4WUM&U)-"WM9C29;$T6O;AD&[?O
    47 MT^O6VS>JWII\[GWT0,Y5(W<0R>N-QZ>?5#,:O6R-'KWR9!MW1J_Z1C=M[Z-'
    48 M;&Y:H_=#=KW3^/23^#$;6"NV'[2AC4G1RT^V;2>V9V2`5JQOB+T]"+4"'"0&
    49 M$+Y;LP#D=#A>>X;YWC/,#^_6<-3@X!G*H`@A=^WI[=[3VT,S:W[U,@9M6@#0
    50 MT_%Y[8G/^RG93G!/8#D=QN.8V@Q"];RF1I8NA",;#>'(IT-X%(,C#,+TS`;'
    51 M=.$;<31\HT@7OE&,AF^4_?"=V_K.\&HZI.=2Q5%@P-)W:Q6@F0[^>\\+<GBW
    52 MA\%+(!@AP.\]???WDS#*!9^.X'M/!/<+=,_<5(Z\P0$$3`=WNBF1$,#CFE+T
    53 M(_2,II3389MN2D4(S7%-J?NQ=T93END"LBA'`[(PTP'Y2INW791L.N)&D^78
    54 M+4CPW?8$$J=#:O)EHQ2$4'QE>4/*Z>!+*V](-1TZTYM,$T+NM28KIX,LT61F
    55 M.D0F-YEB@]`:KSBAV'AQ0O%TLUO%1V>W"M(%T^,=O/Y@JK`?3.,5)Q2.%B>4
    56 MF(ZK5Q4GE`.1H)3O!B-0>CJ81EG`J9(0,',NX)29CJY1BQ.:30?A**;6G!!H
    57 M<YI:PW14CFMJG`[><4PM"'/?K*:6Z0*WEJ.!6ZMT@5NKT<"M]?0L.%,M0)?3
    58 MP3R7*AU$6#+?A4!0$A`A>0%84E!?U`5@20!_N1:`)0$=TDTY1("I33E@?S.:
    59 MD@`$Z:8<@KW4IAP0O?E,:1)B/C..^<P`\Z4K%1@"VXLFJX/YC/#=HP.&@/F2
    60 M+Q@-!0%>N<8V!*I'6V,;`JY+;[(ARHNWZ\*8T5T7R-(A.]OV&+)#1D!VJ8V.
    61 MC(+SKANGR`:$[HWC%%DZZ&;;'@NFR`C0[9KZ`#("2KM.@`-DR$K?52_("(`L
    62 MQE(-.06>95RJ(2>PM9BK8N0$@!;'U!2XEM74`_86+]1R,1IJ.0&SQ3$X!<%E
    63 M-3B!T,4=V^DP'/)1#(><@.'RK/H1")0NERH.XB&`[^84!`+$HR[U$"@P+N92
    64 M#X&`YC(M]1`(<(]N2@JDBVM*`K++9DH"]".;$H?P+K$I<4#MYC,EID-YB*,H
    65 M#W&`\I(5!1`)_"Z:+(?R$)7OPA'$`<J+=N.(;;NU>._*$<0AV(MVYXAMW*V?
    66 M>Y>.(`X`7K1;1VS;KK^]$28&&"_:O2.V;3>7[)E9#*%>M#*%;7R\3"$&\"[>
    67 MW%G`Z-Q9]!%>X8G%42;/8LCPHFVRL(V/;K)`D8[5V;;'6!V*`:M+,%&\=!4)
    68 MB@&VB[;?PK8]MM\"Q0#11;N-!+M;]?IOKL-Q*)GO.A*4!!P79:Q+"JK+M$J0
    69 M!(AWY1K1R2)`NC@&I@"\7`9.=ZS/MCT:N26!XL6Q-87PY;(U@?W%&LPJ'=M#
    70 MMREP,+56!+:7R=J*@/YRJ>+(("KAN^P#5:8#@*CF/P#H[)+^[)^3E>G8'ZKY
    71 MC_VUG=8)\:$>QX<ZTXD_U/.?^'.V3G?8#_7H83_4";FC'N>.>C&'_5`OYK`?
    72 MZ@[+U*7OX@VL-][5#OGZ\Y85G^Q/[KZN]M95J\<;;A>P]>.;N@\$0%Y?G'AN
    73 MBM=-\4%3_*8=$+^NGNR@J-Q@^'W[_.WIMV+S</_X6_&\L7]>5,_%<4@\5:]^
    74 M&C9HCG<N$M1JAU*]S_#\^U#_/@Q^'T*Z`9&ZP5TW+JGEN@%--W:U8W<#Q^[H
    75 MCL6VJ=J"NX$%=R&.W<5R++86N:B6LXAHNU%;<#>PX"[$L;M8CA6N&Y?4<MV0
    76 M33>JVK'5P+$5W;&J;:JV8#6P8!7BV"J68U5KD8MJ.8OHMANU!:N!!:L0QU:Q
    77 M'*M=-RZIY;I1-MW8U+^_&?S^)J0;FUC=*-MN7%3+=:/-*)O:>YN!]S8A@VH3
    78 M:U`9UXU+:K7=,&TVV]2OV6;PFFU82#=8G&X8E\TNJN6ZT>':!GR7O:!!VA3@
    79 MPL37"%KJ#]N18>02,[&1@9G8*%HFOF1?3<O`@?8MEY@031F8$(VA)<1Q^PK&
    80 M:(DPR+Z"\07F):M56%X2#!:8E\3QMLV`O"08TO(2=74EF*!E"'J##I@+IGQW
    81 MLPBF:;%ZN+=#L)(6HRD#V]`",WGKA>",%B,]_>*<%AL)_>)`"X@!_4):;/+U
    82 M2]!B$J5?DA:(`OJEEA@3N`J,"5S38L+E]Y:7M$`PT8ICK@*8[QH1`9SV]D\O
    83 M_00`+1ID+=8(@+!BC0!<X!31:A4V110@:.&/XEA)"X=9BS56J[!BC0"UP+FI
    84 MU2IL;BI`T^(_Q;$E+1]D+=98K<**-0+,$B?%8`(GQ<B6F`"1!29`Y+0$F+58
    85 M8[4**]8(!%H&SEJL$0AAQ1J!#LP+%+[+;P1*VA3@PF(7%2WUARUV42\Q$Z,.
    86 MS,18TC+Q)?L:6@8.LZ]@2TR(@@4F1,%I"?&"?070$F&@?7&)>4E@8%X28HEY
    87 M28C`O"0D+2^1:RM"T3($O4''UH4H?3?6"$%DZY[%OR2R=,+`ED2>35_\2R):
    88 M]O6+B)(I_2+BW(!^$<FJKU]$DDKI%Y%F!O1KB6#1:A48$R01+%Y^;Q61ZTVT
    89 MXK":4."[7$4H(E8C+/T4$:_E+=8H$5BL44OD>5:KP"FB(O(\BF.)7"]OL4;I
    90 MP&*-6B)(M%H%SDT5$202'*N)0#%OL4:SP&*-7B3!U*$$4R^28.I0@JF)!#-O
    91 ML49C8+%&$[EIWF*-%H'%&MVAM5KY+@H2FDAK+RQV-9':ABUV-1'@YLW$V@1F
    92 MXI)(C2_8MR32XS#[ED20G#<AEA"8$$LBO;YD7R+%#K0O$6CGS4NE#,Q+Y2(I
    93 M>AE*T4LB12?75DHB4*<WV&'KAOEN]Q&&R-8]BW]#9.F$@6V(/)N^^#=$M.SK
    94 M%Q$E4_I%Q+D!_2*255^_B"25TB\BS23W2[(E@D7)`L&B9$2P>/&]E8S(]29:
    95 M<5A-,N&[B$8R(E8C3HCBS$DEZY0F+JGEK$Y$>UD+19*IL$*19$MDB5:KL.FI
    96 M9$262)P%QAI4G;+();5<-X@\,VN1RFH55J22?(D`U6H5-B>7_&J`*CD1H&8M
    97 M3EFMPHI3DB^1V%JMPA8!DA.)[<0-19(3D6G6ZI#D,JPZ)#D1U&:M#LGNSF)*
    98 M=4ARAX<E+WTW*$E.Q,,7WF0@8F+J0DG"$@\_2P@\_"R!2*@OF99(JNFF7>+Q
    99 M8ZM58/X!(B2_9%HB+*>;=HD'@*U6@9D`ELCI)01R>@E$3D]V+Q*1/;U!1^\E
    100 M@N\")(E7'XJ5&.E0K%-[B?S<:A48G/'J\[`2(YV'=:9=(L&6&$BP)5Y]%%:*
    101 M2$=A6].*)3)D*0(9LA1+9,A2!#)D*2*?@I4B\BE8*1Q7E4)]*'[XH;#6O-^O
    102 MOKX\WA<WFX?]R2#P/?M>WA5_MS\$QH3[>_VA.$;S+Y]NV-WJ_=W-_N[;^[O'
    103 MES:VUY>JOCP_'HH_/M4EV%H1^.9J@?6VS6,#_S@V4/_QS?Y5`_7NS`?;Z9LO
    104 M=W^\;^]WVG\\7N=4W]%4?VT>?SL^AOIQ?9,3O+,RO\'M-ZC%MBUV,E+]_Q"O
    105 7=M7/NVI5?=O55OS3N_\#_,9%T$[A````
     1begin 640 imap.res.gz
     2M'XL("'?GOU,``VEM87`N<F5S`,U=WW/CMA%^O[^"D^F#KU8NP"Y^$)>YZTRG
     3M+VD[?;F^)U)BI9[QV8[$:Z7_OJ`D$C0)B@N*`/F0.YOV:3_LDOL!^RTW7_[]
     4MMY_^E649_YS]\Z>_9M\5^^+#T^/FNQ_??;G\!#YG]N+/C\^/Q=W['[.7U^+Q
     5MY?GNIZ_KU_<_OBNO9I\_9X_VVP_/#__[L"_61?U/\7-6?RT^9+O'Y]^S'<L^
     6M96R5W:U7F]5A=7R_RIY>G37Y.7M]>3IFK_:W>':?K<O_P/ZQ*;\X_7$H_SB6
     7ME\JORO_*;P[''S/[.6NX7V_NUX?[]?%^?;\YW&_N#\?[P_WQGM<V5`.6KF!Q
     8M:_#.XEI;0'>;579896UL^8W8+)J[]3U__^<3IO.7U:7R>PO=?EF;,PXF9Q5,
     9MJ&"NLDV)M`N3\QMAGK%M/.@V]^?KM2EH0,0+Q'T98`3&L"_(7,0/,I<-:*J"
     10M=@KR!5M_H+E.&FB>-Z":"BHTH:YZ8@TL6:R!.Y0`%Y1%&6O=%V?`^'$&T8`E
     11M*UBG..MK,0:5-,:@&S#S"B94,'OC:Y+%%YE#B/R"<,OJK)BU/9E]?7P^8?MT
     12M1L1KU`B1?>M`-Q@&*X;9NNB'@+Z5>>B@&_R#%?]L3_>",-?N69R`@-;RC,_^
     13M??K&?B5T;:!!.<)23OTU;WQMG_W]0W'A\AJ;P/,FX&YG[Y9R9_###]E_U[ML
     14M_3%[WEFPWW\^_5U=WIPNP^4R5)</I\MXN8S5Y>/ILKA<%I2\(,093W:WXV\`
     15M;=X`:ED&OV6L+=O+K^=5E7^Y95$0R<I#\`;0X0V@EF48M'RYOCE?=QZE(%(7
     16M1/N%Q$Q7,=M?8F9W07_)GE^RQ]\>GHO'XIB5/]WN7KZ65'YAQW5I@KT__^[#
     17M;O>RRUY^_?7;;O?P6_;XG-EO-P_;E]U#=K;R]/C\8"U]S'YY8^J7&D1>.04&
     18M,4"-8;49@R*_H*AL.1#F`J)81F0DJR)3#$;&DJ]-OF.B(ED=E:(5%<DKAPQ&
     19MQ;)J:7]41"2O(E*T(B+A`F`[","F\C*1C_(`5/:W;?M5?MT.!F`[/@!8FV_[
     20M7U3F68ILZKT=:RR-K;U4#39R9"[U(!N=+/H?(.Y_@,#_`&'@5E#F)&;B?E^"
     21MWY?!(`R%C,!/1M@(7,>='C+B@>`4&^2EV:*G>)NC9HB>@ALX:K4.2PH*^EA*
     22MX2!+S1<GT6:L.>(D1[)6<(QD'V\I-8ZW@A&H/N92NL5<20+A8I!3F"N>^<:1
     23M2K,&64%-5IJ/)JM3EO4_1]S_'$%`24##,%-Y$'0>\&/K`0]`@!2:XGZ:"C(D
     24M1E-.Y!C(8;Z)'`/5(IMH,="CZ21R#/)A+HD<`],BDE@QR-E8NEAMP@@C9WV$
     25MD?-!PIC0VR</N/7#(%O$L]TH9N;"4<7>5=ER.4@52>L"N5I:E2W7%,9(667+
     26M\T%J21LS0SK!)(R9812&21DSPP>I*&G,#+09B%1_.QW\PM*R@=X:G,%QIYDQ
     27M*+#O/&/$*((:@T'T$921+8(BU>+&0)!]]3BC**>:-/4XT]`V3=[@+5>/,V;T
     28M$:=[.)NV4L`9(W%8U$H!9YQ"6_/4XSB#T8>C^-'#^>MQG`D*@<T5/3GZ6!4_
     29M>FKX9!4_>OH&7@NMDUEK/=3&63Z>VL)AY#WLQID9/'Y%"$D=#<XHS!;/O&MS
     30MXKS1ZK"OZW6<#[<ZS%*GX)S0\Q"U3L$YJ<?A]CH%Y\.M"S/%H-/#D#P&[0:&
     31M:#$8;E*8)P;0Z59('0-HMRO$B@&,:TNH%<%`UH"^_@0.[?Z$=(4S#L/-"?%L
     32MNV8$#HUFA*(NVG$8;D9X]C\FW2/<!,4$#K0&A'0%(`ZD;H2$!2".PRT(26.&
     33MG;8#<FN<#GS&D??UQG&\H>\@&$9?VP''X;:#M+&AM1HD?)ZPW7<P__,TK@TA
     34M^*;IZT+@2.I"2%(PXTAJ24B$Q?4G<-'H3RCJXAT7X_L3NB>UB0L(@M"BT`4Q
     35M<0%!D+H49BK_B/&=#?&C1VANB!^]=G]#"*D%UUV$ZJ,U,;[](7Z@"!T0\0-%
     36M:H*8Z3&3XQHGPF\@V=<WP>5PWT2$&#D/#+=.1#7ONB>X;'1/%*YP)X>[)^8I
     37M6$A"&T7<@H4DM4U,4+"0P]T0,\6`T!81-P:*U`8Q00S4<'?#/#%0G3:'Y#%H
     38M]SA$B\&X/@8]HFBG^AH9N&HW,B0LG*GA#H9XMEW'`E>-CH6MXPK5T[%P\ZZK
     39M>S;6G0:$_GMAQ\O7L4^W0GE+!-X)VKU@MVN5=G2[`>$*!CAA..^`QZ"H7[+;
     40MM>Y'W6XTN+(59Y>M^%@0KKS$6B`Z'07D4ML8'-A;;=/MKH*`@\D8)*+O9*);
     41M'019S(>ATQ%`ZG0;LU[5U^G&]<B.@#$H>ML!=+L=8*K]]+41`%RWU7]2;]N8
     42MA9N>WC:>MSL`KD!@MZ3#1@MZ*P?DC2Z`O-$%L'55L7Q\%T"$XWI-;3EM[D&T
     43M8UA.Z@!(=DAWN,8W#$0-%Z%=(&JX;IAV$%Z[R/L&'O!\?"]!S/`80B=!S/`8
     44M4A]!^J?)C&L["+]C3&_#@1EN.(@:&=)`A'CF&VT'IM%VL'5M!V91,Q`<\GG&
     45M'SC[RYI\4.$"MJBA!P[6//,.G/V4HPZLM1Z"`K:H60?./?.,.7#V4TTXL)9Z
     46M#DK`$HTXL(9ZR`C8K#,.@,TZXP"8ZR$`SGSCX:!LJ]X^%+_^I\U&UI(]A9T"
     47MLFY<XQ^STWVR:5RSS^:AO'9H7,./V;&\=B0TH4`YKO0$HL,]9Q0;#XJ#!\7Q
     48MC.)<5#P9:MC`>J'@,7'PF#B>350EXOJ31/5)^QE=)FN7Q9[)9FW9Q^NML?H!
     49M*_N]+\Z(/I;-&JN`=&B@;.\^_Z28,2AY'928X]BL'1>0HAT04SLBZD0V:Z@.
     50M1COQEWW>YY]$'<IF[=00VHD?ZKP6<RZ;->,0M`(!4"/PW9'C<UIMP`GK`,(W
     51M;@U`#F?WC>>I.'B>BN.[#9P0'#UW/BA"!M]X5GOPK/98;=K?/+M!;1\`>CC=
     52M;SSI_C!DVQEN&<R'66$:5YM.YI_7U<ANH8#@S1ZR7A)`/DP"D\0`H9/H9XX!
     53MCLWZX?['WKR/8F3>#P<A>C,_RG;F3QT:%Q4U3`&IH#AE'3#WC3L#-,-D<?`\
     54M/<=W!^@\(8(1".'@6;M_G81'0/#AC'_P9'R_07?-[13)320@8)@,Z*Y$0L*?
     55MUI6BG=%G=*4<SNET5RI"WI[6E;J=F&=T93XZ/8?V-H'(>Q.T,,,)^L88U$N6
     56M;#@#3V;+:=,@P3<F#"0.I]CHIU0I"*GYQFJ+E,/)F%9MD6HXE<9WF2:DX%M=
     57ME@\G7:++S'#*C.XRQ3JI-M9H+&NKOQZB^,B=\2@@O'=OK&!<\AT%`WJ3K\)V
     58M\HTU(\N:ZJV-*#&<EF^JC2@GPX)2OM%7H/1P+I[DL*AR0KY->5A49C@Y3UH;
     59MT6PXAT_B:LT)>3JEJS4,)_5I78W#N7\:5PO"5CJIJ^4MB3ZX`J%E;ZK7ZH94
     60M'PY$]29[K8=WVHGJ#SH?SOBIH#14T9SY)DE!3E!%R8?.G*)N3GKHS`E:9ZI#
     61M9TY02^FN[*J>L5W9T3=G="5!XZ2[LJM5QG9E1YF<SY5FI$(Y<CZ3M=>;I$U'
     62MJ8Q7HC`$37(R6PUYT@C?`"8P!'DR^D'54*3+&\_VAJ!&TL[VAB`SQG=95X*,
     63M-?7(VNIM/D%VB_(8",0:Z],=D1%TQ]A!04;1)&^[CY%U9,:1]S&RD5)A<-1Z
     64MA4)D!*'PEB($,H+\=YL!)^HARWTS@I`11+TISH/(*8)?PO,@<H(>..71&SE!
     65M])O&U11!,*FK.WIAS+>5K+G>3,P):N$T,:`HB4EC0!`:I[W=1ZJ)(^+=JR4B
     66M)VB):<H*"`2I,144IT0B@&_D#@)!B:2>)1$HBN*49TD$@KZ8Z"R)0%`HZ:ZD
     67M*(W3NI*@.R9S)4&Y)+L2NPID9%=B1VN<SY4X4F\<,<@&L5=O1.SHC=$J#H@$
     68M57$R6TY@1%2^236(B01&Q*[`&&E0C37E3N.M236('5DQVJ@::ZN^XUJS:E!T
     69MQ,9HPVJL+;<392T872DRXK@::ZZ_3"(Z(F34@3767N_^7+3ER2S60R&Z^F2D
     70M@3765&_["8JQJN08'+V2)(J.)!EA<WIM?@V*CA89:8"-M=37=X*BHT)&&F&#
     71MS?['=F9P^B-*YIMA@Y*@/T[RE$B*-IGHU"()JN6-)UAGBZ!*3N-@BF*9RL&W
     72MO*L9?FR7O6]KHB0HF=.XGZ)RIG(_0?^<ZOY6(_7-\"B[WLO.WE\1E,U$OE<$
     73MX3,5%*>+HA*^"3&H$KVVB6K^US:=7^*_L>EL)7I9$]7\+VO6B]9)W]-$W:^7
     74MZD3O::*>_SU-Y_YDKVBB[GU%$W6J5S11]RNO>C&O:*)>S"N:J!MJKLY]TUJP
     75M;%TLP_/UYQW+/MF?K+ZN#S9PZZ<[;L_2Y>6[<@V$=H%RF.?EHWCY4;SS4?RN
     76MOCU^73_;6Z1PM\;ONY=OS[]EV\>'I]^REVU952I>LM,M\5R\^6G837.:_$F`
     77M5=]*9:?FY?>A_'WH_#Z$+`,F6@9WR[@&RRT#JF7LR\#N.X'=TP.+]4>5'MQW
     78M/+@/">Q^JL!B[9&KL)Q'1+V,TH/[C@?W(8'=3Q58X99Q#99;AJR6492!+3J!
     79M+>B!5?5'E1XL.AXL0@);3!5857OD*BSG$5TOH_1@T?%@$1+88JK`:K>,:[#<
     80M,O)J&=OR][>=W]^&+&,[U3+R>AE78;EEU(RR+:.W[41O&W)3;:>ZJ8Q;QC58
     81M]3),S6;;\C';=AZS+0M9!IMF&<:QV558;AD-X=Z`;Z0/&J1M`:[LBHV@47]8
     82M`XJ12V1B(P.9V"@:$U_SKZ8Q<*!_\R42HLD#"=$8&B'V^U<P1B/"(/\*QA?(
     83M2Q95&"\)!@OD)7&:WQK`2X(AC9>HIRO!!(TAZ!_H.@`$4[Z).H)I6J[N-J\(
     84MEM-R-.7&-K3$3.XM$9S1<J1G79S3<B-A71QH"3%@74C+3;YU"5I.HJQ+TA)1
     85MP+K4$G,"5X$Y@6M:3KC^W/*<E@@&/L6)N`*8;]B+`$Y[^H>/?@*`E@V2%FLL
     86MJK!BC0!<X!;1H@K;(@H0M/1'":RDI<.DQ1J+*JQ8(T`M<&]J487M305H6OZG
     87M!#:G\4'28HU%%5:L$6"6N"D&$[@I1K9$`D062(#(:028M%AC4845:P0"C8&3
     88M%FL$0EBQ1J`3\@4*WXPA@9*V!;ARV$5%H_ZPPR[J)3(QZD`FQIS&Q-?\:V@,
     89M'.9?P99(B((%$J+@-$*\XE\!-"(,]"\ND9<$!O*2$$OD)2$">4E(&B^1:RM"
     90MT1B"_H%.6Q<B]\W\$8*HK7L._Y*HI1-N;$G4L^F'?TF4EGWK(DK)E'41Y=R`
     91M=1&55=^ZB$HJ95U$-3-@74L4%BVJP)P@B<+B]>=6$76]@4]QLII0X!M%(Q11
     92M5B,<_1117DM;K%$BL%BCEJCG652!6T1%U/,H@27J>FF+-4H'%FO4$H5$BRIP
     93M;ZJ(0B(AL)HH**8MUF@66*S1BU0P=:B"J1>I8.I0!5,3%<RTQ1J-@<4:3=1-
     94MTQ9KM`@LUNB&6JN5;U22T$2U]LIA5Q-5V[##KB8*N&F96)M`)LZ)JO$5_^9$
     95M]3C,OSE12$Y+B#D$$F).5*^O^9>H8@?ZERAHI^6E7`;R4KY(%3T/5=%SHHI.
     96MKJWD1$&=_H$-;=TPW_@B88C:NN?P;XA:.N'&-D0]FW[X-T1IV;<NHI1,61=1
     97MS@U8%U%9]:V+J*12UD54,\GKDFR)PJ)D@<*B9$1A\>IS*QE1UQOX%">K229\
     98MDW4DNUE6DXPHJR4MTDBFPHHTDBU1Q[.HPK:&DA%U/.(.;)I#AD7E=F#78+EE
     99M$+7$I`4BBRJL0"3Y$L5+BRIL/RSYS>*EY$3Q,FEAR*(**PQ)OD2UU*(*VX!+
     100M3E1+!T8124Z4*Y-69BRJL,J,Y$21-&EE1C:[>BF5&<F=-"MY[AN')#E1FKWR
     101M)`-1HJ4>4B0L\<5C"8$O'DL@JL/77$M4B>FN7>*KOQ95(/\`4:"^YEJB4$UW
     102M[1)?OK6H`ID`EJB12PC4R"40-7)R>)$HE],_T"GG$L$WK$CBS2^D2ISHA50'
     103M>XG:M445F)SQYG=1)4[T+JIS[1+58XF!ZK'$FU]#E6*BUU!KUXHEZK=2!.JW
     104M4BQ1OY4B4+^58N(W4*68^`U4*9RF*87ZD/WP0V:]^7!8?WU]>LCNMH^'LT/@
     105M>_:]7&5_MS\$QH3[]_I#=LKF7SZ5DT[?K^X.JV_O5T^O=6XOYZ6^OCP=LS\^
     106ME>7/$@A\<W6XLF7R]`'_.'U`^8_O#F\^H.R,?+2+OONR^N-]/5OI\/$T2JF<
     107MCU3^75W^=KH,Y>5RBA*\LS:_P?TW*,W6G]A@I/+_LE[LBY_WQ;KXMB^]^*=W
     108*_P=^R6KV..4`````
    106109`
    107110end
  • Tst/Short/ringmaps.res.gz.uu

    r653440 r6a1aa7  
    1 begin 664 ringmaps.res.gz
    2 M'XL("&&](E,``W)I;F=M87!S+G)E<P"]75MO&S<6?O>O&`1]L"/9.^3A9:;!
    3 M>H'%O@18%#"Z3WWP5E+L0D`BQ[:"1?OKES.2>#N''(XCIF@11\,9GLN(_#Z>
    4 M\[F__N=?'W]IFH;=-O_^^,]W^]?]S>?M^MV'BU^/%_AM8S[\[W:WW5]>?;@8
    5 M_FQN;YN7[>Z/+ZNOKS>[A__=O.Y7>WL#W#;V9W$S#FRVN_W#'P\OS=^;R^./
    6 M5\OF<K5LULMF8W[\]-5-*&^;[:>'U>?FHQG>:]GRMH7V_>I>OE\O&;0@6]WK
    7 M]^OWF_M^R=M>,<U[>;A^#\MF!8NUN-Z`>Z*Z;;X^??ZS><0/;!9-],CFN@D>
    8 MZAZC;YO=MR]KX\;./`@$!P%<N.N=F<9XN[]\]]L[$ZG?[(7^=.&C^=@:L)+K
    9 MY86=?+WIEQ=V8G,-EA=KL5B!\>3T(-:>'O1H'N3?NO"?>NT]QM[*3K?NS*TG
    10 MV^U5?DAH\VP<:U.987#NS#!QELPPF<\,4S8S=T-F[NP%?:[,=&_/3)_+#&^/
    11 MF?EKIUKOZ[-L5)O\"G'F)PK$:L'X>K/@?+-L.*SX6FP6&S>:'Y,P9H&OAJ'K
    12 MS6JQVJR'_]PX"*+,F;LBW)O_-]6.+[_YTUZ6?I1'4P:;!G,NK#EVL/(C>;`&
    13 M5FMW7?OAXLQ^WME`01@HR`2JGQ,H:,L"!2P5*.!>H.`8*+"!`D"!2L8)1#Y.
    14 M(.DX@;)Q8C*($Y/).(&>%:>N,$Y]*DZB]>+$Y"%.S'YE!*/BI$V8NBA*@N>C
    15 M),"/DK(?BU.08/\$X=MD_DW&2<@Y<1*J+$Y")^/4^>_3/1Q?J'N[+HD>14JG
    16 MWBC9YF,E&?U&R=/F\1??/S$>1(N;UXJ'X?+C)6%.O*0HBY>4J7A)Y<6+WS-^
    17 M"-CPDQVB9RQ6LIL(64^'3+5>R%#$>/+]4K,6=E6XL*ODPJY$$"\;+ALM%2SM
    18 MW,3)A.DZBI+"2_JU%R05K.@N1IT7HZZ-@]2E5W4U:U77A:NZ3J[JF@=1ZMI3
    19 MF#J[LFN\LJ??*CVQM.O$TJZ50]Y:WS2O^S%^GU[WSE035/-W8__)5'?)1.WU
    20 M8;SE\A#R*WNM,S%JK(_-_JEY9^"9>=#@Z/#7T-N.N>%;0Q)<XCY>O0%GF?2U
    21 M7<]EQ\PUH7C/M-"M&28=`.MX:LK'JQPBBY_=]4JVG?F'.8360>K9NRL"LG7"
    22 M"]9=&*P[(E@R>OISS3`I/-D9`J3Q4^G0=/Y[9"!B]"H=/XD"U$=/'Z#P,4;F
    23 MPC^:W=/P==_MM_L_&W.]>7QY^C+BY</EAY>7IY?F:;/Y]O+R\,E0T<;\=?WP
    24 M^/3RT!RF^+S=/9AI?FY^3\SS^\F6OB5M>3RS+7U+V_(8V!)_RPYC=N>VA=&V
    25 M[`);>)!80(D%(K%]_+T:H'M!8F&F`X`=`)180=HRF=BYM@C:EC"Q\8IP&#.9
    26 MV+FV2-J6,+$J2*RA#%%B#Y]$B8W7@X%K%"36(/Q9#FCLP&D>YT!'VC*9V+FV
    27 M=+0M86+Q2C:,F4SL7%N(E>PTS\D6UK;A-_8>T%?V\%&06M:B16=@2-.Y'4;-
    28 M<L+,A+QP4SDWXGW_.&@JOV^PAR?L>0SL06O:8=!4CM]@#U[6W%3.'A&D>6`Z
    29 M<9Y/GT6)1HO0R.ZF,ST.F^D*7HF\R9PO,7@YC9I*]EM,4BF3PG2CE>XX:BK?
    30 M;S$)+W?>9,ZD+LHXD7`JWVAM&JAI4;KG^H&7)S>5=8,AI'485)#KF?8P#+;<
    31 M5,X>M/`=!A4D>JX]>.%S4SE[>)3F#F&NTV=AHAE:H4:R=\QTGIHRAF#2\>8Q
    32 M+8BJ,D:M(MT)S%CJRH83>H^7<DM+V7!$[]-2?N4N!6]Z@I5R.SI^P4-2RD>6
    33 M-9*K:_*,G_'XC0PIYD"<AH<L+"]B/,F#1_=M2KB?RQ1CM([P.('/Y2[$Z7O.
    34 M&$_PTLCL$!OFV)PS'D-#2^;HXR/&,8)3P1OG'28Q3I/%T7#[MD&$?3)LQ1H.
    35 MF&W5("MFGFFVP@"AGBILQ<PS35<8T#3NW'3%S#/-5QB$>"?'5UQJ,=^J05?,
    36 M/--\A0$".57XBIEGFK`PH(G<N0F+F:>`L4`(;/*,Q247+0BU"`M@7$,0%H%P
    37 M32W"(C"N(0B+2!"Z\Q,6D2)T099%C&ORA,7F65"PQO*5Q-8B*#AC&07:7$2*
    38 M$X7;BU"1"SD$[AR@J,24_6AK]$`R-C\!\4/K91M9GP>6UGY)`>1N8F^7:"-#
    39 M>-+W0*:P:^2""-`D\^#D4!OTX23S\*0,\I;`D\PY'"<L!)37!SAV#>WAR![Z
    40 MG@9E,DYBB"N/#Q@?=ST^Q-Z81+1C.*[%Z=R=*3^G*8#I/%-Q*I_G^J3BO#Y/
    41 M>J,(6(O\"'?W'.+TO,';>XWZ@9EGNH#`%-[>:Q00S#S3%02F:#!^[@J"F6>Z
    42 MA,!4M+UG0+F76PSWJZ!R11RI(E2N<7&H"BK71'4(H7)-\Y6SHW*=X"M!;G6X
    43 MJ>=0N<NMQKRB"BS7!*]`L%SC^E`56*Z)`A&"Y9HF+&>'Y3I!6,+<AF@G#\N]
    44 M[**UIQ8NUWCU(7"Y1E"J%B[7N%1$X'*=X"WGQ^4ZQ5N"-'<Q+,SC<I=HU`P2
    45 M`/.)\T;4UH$!>G#>B%HU`H3NSAN[N"R2@^B>+Q0!B#`Z<H&J6F0\2-"`$.%V
    46 M\2%_'J1['E`<H/3T%W<_Y$]_<8<"??H[=`]8O,ZD0^M#AX!%ZV;I<5B]#Q)(
    47 M8G7;+\I003U$ZG($M7Q$M&%#C7"(MH_3&*+TX>Z%'/ME6H=I42$\1.@6U_I%
    48 MZ@0^][R)4_@\PP_>QCE\SGG`4;WW.;*=M^'>GL;DS#T4[^PJ>`7I;E[>XDU8
    49 M)=\^CBN8#MTJ.RC:O9*HT[,>HV8HLAZ?8T/&>AK9AM:S<%%.XRIG/:YC.525
    50 MLY[A(V<+@+#UN,CD$(JS/ER$<\C!LQ]EM1)N,#,5X`;.T/)>"3>8F0IP`V<)
    51 M7'5VW&!F*L`-G,4[50XW>&FF]JDZ[0=FKI+V`X[J?_7:#\Q<)>T''!48Z[4?
    52 MF+E*V@\XC\]OT\C*91N5-&LU'YB9"IH/.*J3UFH^,#,5-!]P5(NMU7Q@9BIH
    53 M/N`\/N'.P4\OS12V[0K.:\9A,QTANV6Z-LXT=8+>%9S:O,4D3/R\R9Q)*8A>
    54 MD.W9)I%+7Q>=W_"A8&X!.CC1`!^JX@Z@@Y,,<`C6`1*@6^$;1R7D$*#S8PN\
    55 MQM"6]P[:0ORM#2'Z>/MB?-:".P$F1^5?&J1SOS*;`.F>1T1+_"Q?XO?R><H+
    56 M@A6$]HL0+*:!NO,"%P<Q4">I(A<8+F:@.B[>.:AN:2(7$5Y,8G7/`;J5NL0!
    57 M?%"?0>NX>.?0NN=`B(72<-US@&X9Q@X<\3I3UB:)CZ,CQ,XZSP5<OR,@NXSZ
    58 M_#.0W?F`JW:U(+M,]<0&:[Y$NWLMR"[Q[DY`=IF@-.>'[#)%:8+57L:[>PZR
    59 M>VE.]<)6@.PRV0L;9IK:W2M!=DGN[@BRHZ)M1<@ND\0FR+>*CW;3D-UE&]6(
    60 MJT%VE>J'#5*-*L[5(+O"37$$9$?E[&J07:4H39CD^,0[!]F]-*<:>"M`=J*`
    61 M3D%V7$*O!]F),CH%V7$AO1YD)XKI%&17OM)7>9!=^3I?`[,<9-?3*E_[2STX
    62 MJB]'9^H!S(4`YTH/Y^H)W>Z(=B5"NZ@VG,#L>EJ+Z[F44N(6.Y-4UZ;<2`EG
    63 MG0.EBEG/C8Q>-E_@X5U&WHI!+Z[L4:B]*Y6&.@]P%:]*5X>99[JK@W<_1AEJ
    64 MYIGNZN"X`%FEJ\/,,]W5P;M2;:B7V8PR]$1G)$UGNHR0$PXOI_#Y#"$;MWP&
    65 M+*'IRV60S@M<UZQ%:`CQ-4%H^A\E@C0SE1`:+.RN16@(;3=!:/HY(D@OS3].
    66 M`LD),39%:%`5NB*AZ8LDD!R+O>L1&D+Q31&:OEP"Z64[)X"$=K6`UJQ+3!X6
    67 M)B%/"PV@BKK//,R-XTF+="L38`VU1PV$M,/F*/RL'X"+Z]40.Q`:9`*Q`Z[;
    68 M5T/L9JX2Q`ZDO+D.8@=:WAPC=FB=!O+.PG5H/?WC\Y7[>$K[>&='YG6/;_^E
    69 MAX`DNMNRW[E#_!9$0&T)V]SOV`$VI9BT[J-.A+?^>AW?\92,<I[+*8$E<K9,
    70 M9^E<SF@L\P0`V)36TB<`@(OT!`$`7J:VM.;CHG;AF3WPC"P26X^+SL29/?`R
    71 M0:&S/B,FS/37`,_H_@C;,\(\90>5"N:<\3FQ7/:W!P+D=&W8`2RG]2"BBSZ4
    72 MJ\&L$UB/6MYP"JB&F&\X!:P=)1M.`4HU8<Z-`CT8LGY2#Q8:7R((`U$N"+/&
    73 MX\)A>9LIX-IAMLT42.D?;C,%X<G"W`8K/$78<=-QVZR8E(39D7DUV'?L-DCD
    74 M]QW;+"HGYK=9.:D;LR-3DK'O<!R)`]^TS:+J8VJ;E87B,CL^HRN;>,-E1@6&
    75 MWV]<6*.V65FHG[+C,]*I_#:K,CHG;#TN%%';K"I4"-GQ&7%0;IM5&1T/87M&
    76 M:&.W654L@+%WY+0O^6U6Y60JA`,Y%8F+OIXA[K#W?(>N`]"Q_\0VB[5@]#:K
    77 MBW4=]H[YD@Y`Y_SY;19+G:AM5L^0=-A[OD/-`?BP/[_-DD(>8IL=#OSMSW`S
    78 9_M\CAO]!Q+?72W;UX:>+_P/6*"8!<F(`````
     1begin 640 ringmaps.res.gz
     2M'XL(""RJOU,``W)I;F=M87!S+G)E<P"]7=]OX[@1?L]?(2SZD*SM5.20E-1%
     3M4Z#HRP+%`<'UZ1[2L[W)(<"NLTF\*.[^^E*2S5\SI,A(N<,=-FM1S#?#\7`^
     4MS@SOY__\Z_-/556QF^K?G__YX?AZO/[ZN/OPZ>+GTP-^4^D/__MX>#Q>7GVZ
     5MZ/^L;FZJE\?#;]^VWU^O#_?_NWX];H_F!;BIS,_B>AA8/1Z.][_=OU1_KRY/
     6M/UZMJ\OMNMJMJ[W^\<MW^POE3?7XY7[[M?JLAW>-K'E=0_UQ>R<_[M8,:I!U
     7MTS4?=Q_W=]V:UYUB#>_D^/P.UM465CNQV8.=4=U4WY^^_EX]X`FK515,66TJ
     8M;U([37-3'7Y\VVDQ#GHB$!P$<&&?M_K7:&F/EQ]^^:`U]8MYT)T??-8?&P!;
     9MN5M?F%^^VW?K"_.+]3-87^S$:@M:DO-$K#Y/]*`G<E]=N;-NG&G,J^S\ZD&_
     10M>L9NGO)Q0:MG+5@=6QD&2Z\,$XNL#)/IE6'*K,QMOS*WYD&SU,JT;U^9+K4R
     11MO#ZMS!\'53M?GW6EZNA7B#-WH4!L5XSO]BO.]^N*PY;OQ'ZUMZ/Y:1&&5>#;
     12M?NANOUUM][O^/SL./"US9I\(:_E_5?5@_/I/\UBZ6AZ@])AZ.!<&CAFL7$V.
     13M:&"[L\\;5UV<F<];HRCP%04)174EBH(Z3U'`8HH"[B@*3HH"HR@`I*BHGD"D
     14M]022UA,HHR<F/3TQ&=43-$5Z:C/UU,7T)&I'3TR.>F+F*R,8I:=&JZD-M"1X
     15M6DL"7"TI\[$X*PF.3^!;D_XWJB<A2_0D5)Z>1!/54^O:TQV<#.K.^"71(4TU
     16M,8N2=5I7DM$6)<^;QQ_\^,2XIRVNS8K[ZG+U):%$7U+DZ4O*F+ZD<O3%[Q@?
     17M%=;_9(8T!<Y*MA,JZVB5J=I1&=(8C]J7*G+L*M.QJZAC5\+3EU&7T9;R7#O7
     18M>M)JV@1:4MBE;QPE*<^C6QVUCH[:.E12&_?JJLBK-YE>O8EZ]89[6FKKLYI:
     19MX]D;[-GC5M5,N/8FXMH;92/OIKFN7H^#_KZ\'BU4K53]=XW_#-4^TEI[O1]>
     20MN1Q5?F6>M5I'E9&Q.CY5'W1XIB?J!>W_ZDO;,CO\49,$NW"?K]X09^GEJ]N.
     21MRY;I9T+QCC6BJ?4P:0.PEL=^Y<-5*B(+YVX[)>M6_\-LA-9";.[#%1&RM<)1
     22MUJVOK%M"63*8_?D]U:3P+UM`00V>E59-Z]J1#A$#4SI]$BBH"V;O0^&3CO2#
     23M?U2'I_[K?C@^'G^O]//JX>7IVQ@OFY72/V]NSBQTW<]^-;Y[__+R]%(][?<_
     24M7E[NO^@1E?[K[O[AZ>6^&G__U\?#O<;PM^K7"(A?ST"[F@3Z\&<"[6H:Z(,'
     25M-/Q^CF,.?RI01@,]>$"Y9R^`[`4(>^G"KVO/"#+L!1SI8*YT@*4#9"^"!#II
     26M+XL"%310WUY"%S6.F;2718%*&JAO+\JS%TUP`GL9/PGL)?1>/3/*L!<]EY%.
     27M_SQ/N@9+=P9AI6M)H)/VLBC0E@;JVPOVV/V827M9%"CAL<\@SD!97?O^Y0Z0
     28M@QD_\BR&U<A_]C1QVF0&,FF_$7KJ62)J'$A&"\0*&89&IT%3=K,X6AY!^^"A
     29M1=Y['#1E/(NCQ1[<`K%HA6=`/9$,+>C\66!"R*4.Y'G:AD:.;03E:_VWF9)B
     30MS^I@L:*&H>-YU)0=O0-B%4/LFQ)R[*=14[;T#HBQ?W>P6,1M8$Z$-5'&A/QM
     31M?ZR094N>F+.EQ#[7`C%",A0FCX,R[&A1M`R'RA:(18M\_3@HPX:618M]O05B
     32MT?+`@%H4,I\_\TV((;<['`&<;"A]8,$8"F1/+P]+B@XP&*.<7WN.*,V!!NOS
     33M-LYI!3>'%:Q/W+B'%?S*/O*^0Y&S"FY&AU\=_ZB"#]Q[H-P;,O/#>&C-_L%#
     34M3Z?[25:&+3,>/1T9Q#=+PMVUC)TC&$%XN(#/^2*$R_><`$^<5@2P_1@\Q?$M
     35M>!R"&XI/'RHRCH-AY5F<<\3(.'V$,``WU@9!,)@@FP8X8"8]EVNN>:%G`())
     36MAUR3`0H"9W/-<J`X`$1<DP'-WN=PS7*@$?;NN5KP0[\4U[3F@HGT7*I9+AQ!
     37MI$.JR0`%>[.I9CE0'.4AJLF`)N]SJ&8YT`AY]\W%#^W25-,:#')<2S#-<@EQ
     38M8$<038$"NR6(9C%8@>,Z@F>*"(>?QS/+P<8HO&<\(@SKTC33F(^@HCK#,B,[
     39MJZ"B.4/TT-XJ8DS6WUV%"D1(41LK`$7AIO"CR,#A%QA^A#OYZ&4=H$_'U0:_
     40MI-A#.Q':2+17HW#:E4#&0O=`!.$%T\R)ION$N1M-,R><EMZZ1<)I9@4.%\R/
     41MIS=C-+J!>LQC0=?1,:D,%]$/JT\3#--MADG,B]&`?E#'1IR344RY:QJ+KZUD
     42M*ES*YU*95+BNSY/2*"*J1W+X@4@JX':DP9'(W*3:FI4Z/T6$(F%6C2D<BLS-
     43MJKT!*1&+A&DUIF@6,R>M]@:D1#`2YM68"H*1!-5Q3`:3J-E<IUP\XE@?D9T&
     44M)V)GDYUBI`V1B45LIZ'YXRRV4XXT0B`]DVG\$"1%=ZS)-)C,S>8[Y>(1;`X1
     45MG@;G8F<3GG*D1#(6,9Z&YI"S&$\YT@B)]$W&#_G2E,<Q&N1&%^$\Y3)B3TJ0
     46MG@9%FXN0GG*T.#%+L)XFPB=GLIYRM#%"Z1E0&T;=:=IC30@5H'F\9^(T&Y62
     47M8?[CG6:C\C"/`-G3[#;,%:88D",+Q:\""H1$H')U"0DB+,LG$&V8G$IS($<"
     48MBF+EYA9P454ZMX!KF^C<0E]:9.@0DY8,]>5#A@QIIV:I4.<M($F%3(TZ0S4S
     49M/A&2`V?@`V'PB_B$)0Q=N(P^">K?7LFA1J^VE`&5L_@$R-`&MYHD0G\<:<(E
     50M?"Z0@]?A&CZG)."HO.(YP,YK/QB)4QYF)\6AB/),D.X@X#4.#%34^CA.ZUL*
     51MH,R@8%^,1M\.>DPM(`L]SI)``CT=X?OHF>^4XX&@18]SJ#8,3*%G.&EA@C*,
     52M'J<P;6!DT?M..!63./C1JBX0D6C/4K1G:A09\0AGR/4O$(^48\5\&4<CG$4B
     53MO5G12#G66)QW\+"&NU\J%G%,A]K[%JCS*9>2K,T(JWPX2F<O5.53C)>3U1EA
     54MC0]'R?2%:GS*\9+U&6&%#^?A27X\"+1&A'+[2]3WE$N(>32N[N&HF&")ZIYR
     55MK)A)X]H>CHH9EJCM*<=*UM\APPGS)ZGHVS$=*K1O,X[MQJ8K*V0_]RPIR0JX
     56MM@[-ATK>M!F'=XOCQ7S:06+QQKA-A@TMBY?T[VUPC,?[(A=#>\"V?_&^DL72
     57M'K#-7QP\ET72'M/"S%'YAD][^*F9J<&$@7>6,$#H1'SB,[R^&N9:<=M*SU%Y
     58M!4U]N%O=$*$^CD1$<U.1+*%%/T])07`M'[_P0_`X_;%2X'0WIC\D`><"!^$)
     59M`H0SSI8`&?+-11"%1QF0(P#=@Y(C`$X@)3@0SCA;#N0(X$>#<1+D"$`W16`!
     60M3BR(*8-)XGQ&P(-8ZXB`D\X$$9)!:U6""%D9<*IY`2($A:6P&D4.$9(H$%F`
     61M")5CQ8$(081DA&#.(D+E6&,$T]M!9!B(I(B08SJQ8OR91*A<RF@IOF\^5""R
     62M`!$JQTL&(H@(H;J'A8A0.=XHT?3,2(5G^W$B9(T(U6`L082*)52Q4GS/@%"U
     63MQQ)$J!PKKKDEB!`J,UF"")5CC1%,WW#"-$J*"#FF$^LYF$F$RJ4DZ1XB0KCL
     64M91DB5(Z7;+9"1`@7ORQ#A,KQ1HFF;T;N31C*(4+*O0=#!Z^6"#73MV"82Z\X
     65MJNSPB9#TR`-X[$$Z[*&9N-=BX!`2<0A4>!%A0LWT716.2+&;*K*%B=X^$1,C
     66M=K&$%2#W1@E'C,1]$NED)&\3-SQ@*H&ST!07:G/O.+`2X(SSW$HL5?HM:S,N
     67M..#MXA<<E./,N-^`XQ3[W"JL<IP9UQOP-O=Z`\=4$I<;G%FGI%EGF[AN`$9K
     68M%R[M).YI,;03#._L\EONK10XJ;\`[RQ>(^+*$H)W=N_1;E^.-:?9GN.K4A;@
     69MG>58<UKM>5?2:N^8SCLUVI=+F=5FSU'-QT*\LQQO5I,]Q[>G+,,[R_%FM=CS
     70M+K_%WC&B5(,]U-L5U-J%,CGZ4"'//A%0Y8M+`O6+P]F=M$X4\-4B#A,3T@PK
     71MZ?,V<@`N@EF&!)4N%A"W:Q`D"'#QS3(DJ!POF4\,21"0MWHL0(+*\49)YL'#
     72M:QOL;PT#@MIIKG^^LA]/-=;?FI'IIOJWW[,,Z.Z(@`X57+P,J"K)YTC!W77`
     73MIMKQC?BH$.FM-_JY@L=Z],M$CG7O(V'SFOBMR(D&_C2G`C;5R.]R*L#U-`2G
     74M`I[7RF_@XRJ2S.02\$1?/4:/"SF(Y!+PO,YRBS[159XHKP.>:/(FL"<ZK949
     75ME-OE;,&G.IR3%Q8#I/J-L0#XK@8GV+7:A_Q>6R,$OK0@O]X<4+([76\.^!(!
     76MLMX<(+?CUHJ1T6V+T$]VV_K@<]IM0>2WVQKP.,.=7V4..,F=K#('LK$:5YF#
     77M<)IN[08KG'[;TZ9CMUDQV7!K1J9[;6?L-JB%>L8VB_+>Z6U63G;EFI&QAMP9
     78M@J/6ZS=MLRA-'MMF96;KKAF?Z-J=L'"9:*/%]HVSM=0V*S/;2,WX1`=I>IM5
     79MB8Y.C!ZG":EM5F5V-)KQB6;&U#:K$JV%!/9$>Y_99E5V9YUY(]54E]YF5:K#
     80MC1`@U6)FM=\4]':9=V:T=0'*I$QLL[AWE=YFF^RV+O-&>4<7H-1)>IO%/934
     81M-ML4='29=V8T<P'.GZ2W6;*/C]AF^QR*^1FNA_]A5?__I/KQ>LFN/OWEXO_P
     82'$%6HY6H`````
    7983`
    8084end
  • libpolys/coeffs/OPAE.cc

    r653440 r6a1aa7  
    341341    r->cfName = nAEName;
    342342    r->cfInpMult=nAEInpMult; //????
    343     r->cfInit_bigint= NULL; // nAEMap0;
    344343    r->cfCoeffWrite=nAECoeffWrite; //????
    345344
  • libpolys/coeffs/OPAEQ.cc

    r653440 r6a1aa7  
    334334    r->cfName = nAEQName;
    335335    r->cfInpMult=nAEQInpMult; //????
    336     r->cfInit_bigint= NULL; // nAEQMap0;
    337336    r->cfCoeffWrite=nAEQCoeffWrite; //????
    338337
  • libpolys/coeffs/OPAEp.cc

    r653440 r6a1aa7  
    363363    r->cfName = nAEpName;
    364364    r->cfInpMult=nAEpInpMult; //????
    365     r->cfInit_bigint= NULL; // nAEpMap0;
    366365    r->cfCoeffWrite=nAEpCoeffWrite; //????
    367366
  • libpolys/coeffs/coeffs.h

    r653440 r6a1aa7  
    9191} LongComplexInfo;
    9292
     93
     94enum n_coeffRep
     95{
     96  n_rep_unknown=0,
     97  n_rep_int,      /**< (int), see modulop.h */
     98  n_rep_gap_rat,  /**< (number), see longrat.h */
     99  n_rep_gap_gmp,  /**< (), see rinteger.h, new impl. */
     100  n_rep_poly,     /**< (poly), see algext.h */
     101  n_rep_rat_fct,  /**< (fraction), see transext.h */
     102  n_rep_gmp,      /**< (mpz_ptr), see rmodulon,h */
     103  n_rep_float,    /**< (float), see shortfl.h */
     104  n_rep_gmp_float,  /**< (gmp_float), see  */
     105  n_rep_gmp_complex,/**< (gmp_complex), see gnumpc.h */
     106  n_rep_gf        /**< (int), see ffields.h */
     107};
     108
    93109struct n_Procs_s
    94110{
     
    96112   coeffs next;
    97113   int     ref;
     114   n_coeffRep rep;
    98115   n_coeffType type;
    99116   /// how many variables of factory are already used by this coeff
     
    251268   /// Inplace: a += b
    252269   void    (*cfInpAdd)(number &a, number b, const coeffs r);
    253 
    254    /// maps the bigint i (from dummy == coeffs_BIGINT!!!) into the
    255    /// coeffs dst
    256    /// TODO: to be exchanged with a map!!!
    257    number  (*cfInit_bigint)(number i, const coeffs dummy, const coeffs dst);
    258270
    259271   /// rational reconstruction: "best" rational a/b with a/b = p mod n
     
    768780}
    769781
    770 static inline number  n_Init_bigint(number i, const coeffs dummy,
    771                 const coeffs dst)
    772 {
    773   assume(dummy != NULL && dst != NULL); assume(dst->cfInit_bigint!=NULL);
    774   return dst->cfInit_bigint(i, dummy, dst);
    775 }
    776 
    777782static inline number  n_RePart(number i, const coeffs cf)
    778783{
  • libpolys/coeffs/ffields.cc

    r653440 r6a1aa7  
    798798    }
    799799  }
    800   if (nCoeff_is_Zp(src,dst->m_nfCharP))
     800  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src,dst->m_nfCharP))
    801801  {
    802802    return nfMapP;    /* Z/p -> GF(p,n) */
    803803  }
     804  if (src->rep==n_rep_gap_rat) /*Q, Z */
     805    return nlModP;
    804806  return NULL;     /* default */
    805807}
     
    832834  r->is_field=TRUE;
    833835  r->is_domain=TRUE;
     836  r->rep=n_rep_gf;
    834837  //r->cfInitChar=npInitChar;
    835838  r->cfKillChar=nfKillChar;
     
    860863
    861864  r->cfWriteLong = nfWriteLong;
    862   r->cfInit_bigint = nlModP;
    863865  r->cfRead = nfRead;
    864866  //r->cfNormalize=ndNormalize;
  • libpolys/coeffs/gnumpc.cc

    r653440 r6a1aa7  
    475475  n->is_field=TRUE;
    476476  n->is_domain=TRUE;
     477  n->rep=n_rep_gmp_complex;
    477478
    478479  n->cfKillChar = ngcKillChar;
     
    516517
    517518  n->cfSetChar=ngcSetChar;
    518 
    519   n->cfInit_bigint=ngcMapQ;
    520519
    521520// we need to initialize n->nNULL at least for minpoly printing
     
    624623{
    625624  assume( getCoeffType(r) == ID );
    626   assume( getCoeffType(aRing) == n_Q );
     625  assume( aRing->rep == n_rep_gap_rat);
    627626
    628627  if ( from != NULL )
     
    635634}
    636635
     636number ngcMapZ(number from, const coeffs aRing, const coeffs r)
     637{
     638  assume( getCoeffType(r) == ID );
     639  assume( aRing->rep == n_rep_gap_gmp);
     640
     641  if ( from != NULL )
     642  {
     643    if (SR_HDL(from) & SR_INT)
     644    {
     645      gmp_float f_i= gmp_float(SR_TO_INT(from));
     646      gmp_complex *res=new gmp_complex(f_i);
     647      return (number)res;
     648    }
     649    gmp_float f_i=(mpz_ptr)from;
     650    gmp_complex *res=new gmp_complex(f_i);
     651    return (number)res;
     652  }
     653  else
     654    return NULL;
     655}
     656
    637657static number ngcMapLongR(number from, const coeffs aRing, const coeffs r)
    638658{
     
    692712  assume( getCoeffType(dst) == ID );
    693713
    694   if (nCoeff_is_Q(src))
     714  if (src->rep==n_rep_gap_rat) /* Q, Z*/
    695715  {
    696716    return ngcMapQ;
    697717  }
    698   if (nCoeff_is_long_R(src))
     718  if (src->rep==n_rep_gap_gmp) /* Z */
     719  {
     720    return ngcMapZ;
     721  }
     722  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    699723  {
    700724    return ngcMapLongR;
    701725  }
    702   if (nCoeff_is_long_C(src))
     726  if ((src->rep==n_rep_gmp_complex) && nCoeff_is_long_C(src))
    703727  {
    704728    return ngcCopyMap;
    705729  }
    706   if (nCoeff_is_R(src))
     730  if ((src->rep==n_rep_float) && nCoeff_is_R(src))
    707731  {
    708732    return ngcMapR;
    709733  }
    710   if (nCoeff_is_Zp(src))
     734  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src))
    711735  {
    712736    return ngcMapP;
  • libpolys/coeffs/gnumpfl.cc

    r653440 r6a1aa7  
    413413  n->is_field=TRUE;
    414414  n->is_domain=TRUE;
     415  n->rep=n_rep_gmp_float;
    415416
    416417  n->cfKillChar = ndKillChar; /* dummy */
     
    443444  n->cfSetMap = ngfSetMap;
    444445  n->cfCoeffWrite = ngfCoeffWrite;
    445   n->cfInit_bigint = ngfMapQ;
    446446#ifdef LDEBUG
    447447  n->cfDBTest  = ndDBTest; // not yet implemented: ngfDBTest
     
    474474{
    475475  assume( getCoeffType(dst) == ID );
    476   assume( getCoeffType(src) == n_Q );
     476  assume( src->rep == n_rep_gap_rat );
    477477 
    478478  gmp_float *res=new gmp_float(numberFieldToFloat(from,QTOF,dst));
    479479  return (number)res;
    480480}
     481number ngfMapZ(number from, const coeffs aRing, const coeffs r)
     482{
     483  assume( getCoeffType(r) == ID );
     484  assume( aRing->rep == n_rep_gap_gmp);
     485
     486  if ( from != NULL )
     487  {
     488    if (SR_HDL(from) & SR_INT)
     489    {
     490      gmp_float f_i= gmp_float(SR_TO_INT(from));
     491      gmp_float *res=new gmp_float(f_i);
     492      return (number)res;
     493    }
     494    gmp_float f_i=(mpz_ptr)from;
     495    gmp_float *res=new gmp_float(f_i);
     496    return (number)res;
     497  }
     498  else
     499    return NULL;
     500}
     501
    481502
    482503static number ngfMapR(number from, const coeffs src, const coeffs dst)
     
    510531  assume( getCoeffType(dst) == ID );
    511532 
    512   if (nCoeff_is_Q(src))
     533  if (src->rep==n_rep_gap_rat) /*Q, Z*/
    513534  {
    514535    return ngfMapQ;
    515536  }
    516   if (nCoeff_is_long_R(src))
     537  if (src->rep==n_rep_gap_gmp) /*Q, Z*/
     538  {
     539    return ngfMapZ;
     540  }
     541  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    517542  {
    518543    return ndCopyMap; //ngfCopyMap;
    519544  }
    520   if (nCoeff_is_R(src))
     545  if ((src->rep==n_rep_float) && nCoeff_is_R(src))
    521546  {
    522547    return ngfMapR;
    523548  }
    524   if (nCoeff_is_long_C(src))
     549  if ((src->rep==n_rep_gmp_complex) && nCoeff_is_long_C(src))
    525550  {
    526551    return ngfMapC;
    527552  }
    528   if (nCoeff_is_Zp(src))
     553  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src))
    529554  {
    530555    return ngfMapP;
     
    532557  return NULL;
    533558}
    534 
    535559
    536560void    ngfCoeffWrite  (const coeffs r, BOOLEAN /*details*/)
  • libpolys/coeffs/longrat.cc

    r653440 r6a1aa7  
    144144  z=nlShort3(z);
    145145  return z;
     146}
     147
     148number nlMapZ(number from, const coeffs src, const coeffs dst)
     149{
     150  if (SR_HDL(from) & SR_INT)
     151  {
     152    return from;
     153  }
     154  return nlMapGMP(from,src,dst);
    146155}
    147156
     
    12881297}
    12891298
    1290 // Map q \in QQ \to Zp
    1291 // src = Q, dst = Zp (or an extension of Zp?)
     1299// Map q \in QQ or ZZ \to Zp or an extension of it
     1300// src = Q or Z, dst = Zp (or an extension of Zp)
    12921301number nlModP(number q, const coeffs Q, const coeffs Zp)
    12931302{
     
    21682177nMapFunc nlSetMap(const coeffs src, const coeffs dst)
    21692178{
    2170   if (getCoeffType(src)==n_Q /*nCoeff_is_Q(src) or coeffs_BIGINT*/)
     2179  if (src->rep==n_rep_gap_rat)  /*Q, coeffs_BIGINT */
    21712180  {
    21722181    return ndCopyMap;
    21732182  }
    2174   if (nCoeff_is_Zp(src))
     2183  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src))
    21752184  {
    21762185    return nlMapP;
    21772186  }
    2178   if (nCoeff_is_R(src))
     2187  if ((src->rep==n_rep_float) && nCoeff_is_R(src))
    21792188  {
    21802189    return nlMapR;
    21812190  }
    2182   if (nCoeff_is_long_R(src))
     2191  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    21832192  {
    21842193    return nlMapLongR; /* long R -> Q */
    21852194  }
    21862195#ifdef HAVE_RINGS
    2187   if (nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
     2196  if (src->rep==n_rep_gmp) // nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
    21882197  {
    21892198    return nlMapGMP;
    21902199  }
    2191   if (nCoeff_is_Ring_2toM(src))
     2200  if (src->rep==n_rep_gap_gmp)
     2201  {
     2202    return nlMapZ;
     2203  }
     2204  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src))
    21922205  {
    21932206    return nlMapMachineInt;
     
    30203033{
    30213034  r->is_domain=TRUE;
     3035  r->rep=n_rep_gap_rat;
    30223036
    30233037  //const int ch = (int)(long)(p);
     
    30833097  r->cfInpMult=nlInpMult;
    30843098  r->cfInpAdd=nlInpAdd;
    3085   r->cfInit_bigint=nlCopyMap;
    30863099  r->cfCoeffWrite=nlCoeffWrite;
    30873100
  • libpolys/coeffs/modulop.cc

    r653440 r6a1aa7  
    457457  r->is_field=TRUE;
    458458  r->is_domain=TRUE;
     459  r->rep=n_rep_int;
    459460
    460461  r->ch = c;
     
    503504  //r->cfName = ndName;
    504505  r->cfInpMult=ndInpMult;
    505   r->cfInit_bigint= nlModP; // npMap0;
    506506#ifdef NV_OPS
    507507  if (c>NV_MAX_PRIME)
     
    690690}
    691691
     692number npMapZ(number from, const coeffs src, const coeffs dst)
     693{
     694  if (SR_HDL(from) & SR_INT)
     695  {
     696    long f_i=SR_TO_INT(from);
     697    return npInit(f_i,dst);
     698  }
     699  return npMapGMP(from,src,dst);
     700}
     701
    692702/*2
    693703* convert from an machine long
     
    710720{
    711721#ifdef HAVE_RINGS
    712   if (nCoeff_is_Ring_2toM(src))
     722  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src))
    713723  {
    714724    return npMapMachineInt;
    715725  }
    716   if (nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
     726  if (src->rep==n_rep_gmp) //nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
    717727  {
    718728    return npMapGMP;
    719729  }
    720 #endif
    721   if (nCoeff_is_Q(src))
     730  if (src->rep==n_rep_gap_gmp) //nCoeff_is_Ring_Z(src)
     731  {
     732    return npMapZ;
     733  }
     734#endif
     735  if (src->rep==n_rep_gap_rat)  /* Q, Z */
    722736  {
    723737    return nlModP; // npMap0;
    724738  }
    725   if ( nCoeff_is_Zp(src) )
     739  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src) )
    726740  {
    727741    if (n_GetChar(src) == n_GetChar(dst))
     
    734748    }
    735749  }
    736   if (nCoeff_is_long_R(src))
     750  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    737751  {
    738752    return npMapLongR;
  • libpolys/coeffs/mpr_complex.cc

    r653440 r6a1aa7  
    444444      if (SR_HDL(num) & SR_INT)
    445445      {
    446         int nn = SR_TO_INT(num);
    447         if((long)nn == SR_TO_INT(num))
    448             r = SR_TO_INT(num);
    449         else
    450             r = gmp_float(SR_TO_INT(num));
     446        r = gmp_float(SR_TO_INT(num));
    451447      }
    452448      else
     
    458454        if (SR_HDL(num) & SR_INT)
    459455        {
    460           int nn = SR_TO_INT(num);
    461           if((long)nn == SR_TO_INT(num))
    462             r = SR_TO_INT(num);
    463           else
    464             r = gmp_float(SR_TO_INT(num));
     456          r = gmp_float(SR_TO_INT(num));
    465457        }
    466458        else
  • libpolys/coeffs/numbers.cc

    r653440 r6a1aa7  
    7979number ndFarey(number,number,const coeffs r)
    8080{
    81   Werror("farey not implemented for (c=%d)",getCoeffType(r));
     81  Werror("farey not implemented for %s (c=%d)",r->cfCoeffString(r),getCoeffType(r));
    8282  return NULL;
    8383}
    8484number ndChineseRemainder(number *,number *,int,BOOLEAN,const coeffs r)
    8585{
    86   Werror("ChineseRemainder not implemented for (c=%d)",getCoeffType(r));
     86  Werror("ChineseRemainder not implemented for %s (c=%d)",r->cfCoeffString(r),getCoeffType(r));
    8787  return n_Init(0,r);
    8888}
     
    243243{
    244244  Werror("no conversion from factory");
    245   return NULL;
    246 }
    247 
    248 number  ndInit_bigint(number, const coeffs, const coeffs)
    249 {
    250   Werror("no conversion from bigint to this field");
    251245  return NULL;
    252246}
     
    338332    n->cfGcd  = ndGcd;
    339333    n->cfLcm  = ndGcd; /* tricky, isn't it ?*/
    340     n->cfInit_bigint = ndInit_bigint;
    341334    n->cfInitMPZ = ndInitMPZ;
    342335    n->cfMPZ = ndMPZ;
  • libpolys/coeffs/rintegers.cc

    r653440 r6a1aa7  
    33****************************************/
    44/*
    5 * ABSTRACT: numbers modulo n
     5* ABSTRACT: numbers (integers)
    66*/
    77
     
    2929omBin gmp_nrz_bin = omGetSpecBin(sizeof(mpz_t));
    3030
     31#if SI_INTEGER_VARIANT == 2
    3132/*
    3233 * Multiply two numbers
     
    214215  mpz_init(r);
    215216  mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b);
    216   if (!nrzIsZero((number) r, R))
    217   {
    218     WerrorS("Division by non divisible element.");
    219     WerrorS("Result is without remainder.");
    220   }
     217  //if (!nrzIsZero((number) r, R))
     218  //{
     219  //  WerrorS("Division by non divisible element.");
     220  //  WerrorS("Result is without remainder.");
     221  //}
    221222  mpz_clear(r);
    222223  omFreeBin(r, gmp_nrz_bin);
     
    408409  r->is_field=FALSE;
    409410  r->is_domain=TRUE;
     411  r->rep=n_rep_gmp;
    410412
    411413  r->nCoeffIsEqual = ndCoeffIsEqual;
     
    427429  r->cfExtGcd = nrzExtGcd; // only for ring stuff
    428430  r->cfDivBy = nrzDivBy; // only for ring stuff
    429   r->cfInit_bigint = nrzMapQ;
    430431  //#endif
    431432  r->cfInpNeg   = nrzNeg;
     
    460461}
    461462
    462 #endif
     463#elif SI_INTEGER_VARIANT == 3
     464
     465//make sure that a small number is an immediate integer
     466//bascially coped from longrat.cc nlShort3
     467//TODO: is there any point in checking 0 first???
     468//TODO: it is not clear that this works in 32/64 bit everywhere.
     469//      too many hacks.
     470#ifdef LDEBUG
     471#define nrzTest(A) nrzDBTest(A,__FILE__,__LINE__,NULL)
     472BOOLEAN nrzDBTest (number x, const char *f, const int l, const coeffs);
     473#else
     474#define nrzTest(A)
     475#endif
     476
     477#define CF_DEBUG 0
     478static inline number nrz_short(number x)
     479{
     480#if CF_DEBUG
     481  StringAppendS("short(");
     482  nrzWrite(x, NULL);
     483#endif
     484  if (mpz_cmp_ui((int_number) x,(long)0)==0)
     485  {
     486    mpz_clear((int_number)x);
     487    omFreeBin(x, gmp_nrz_bin);
     488#if CF_DEBUG
     489    StringAppendS(")=0");
     490#endif
     491    return INT_TO_SR(0);
     492  }
     493  if (mpz_size1((int_number)x)<=MP_SMALL)
     494  {
     495    int ui=mpz_get_si((int_number)x);
     496    if ((((ui<<3)>>3)==ui)
     497    && (mpz_cmp_si((int_number)x,(long)ui)==0))
     498    {
     499      mpz_clear((int_number)x);
     500      omFreeBin(x, gmp_nrz_bin);
     501#if CF_DEBUG
     502    StringAppendS(")=imm");
     503#endif
     504      return INT_TO_SR(ui);
     505    }
     506  }
     507#if CF_DEBUG
     508  StringAppendS(")");
     509#endif
     510  return x;
     511}
     512
     513
     514
     515
     516/*
     517 * Multiply two numbers
     518 * check for 0, 1, -1 maybe
     519 */
     520#if CF_DEBUG
     521number _nrzMult(number, number, const coeffs);
     522number nrzMult(number a, number b, const coeffs R)
     523{
     524  StringSetS("Mult: ");
     525  nrzWrite(a, R);
     526  StringAppendS(" by ");
     527  nrzWrite(b, R);
     528  number c = _nrzMult(a, b, R);
     529  StringAppendS(" is ");
     530  nrzWrite(c, R);
     531  char * s = StringEndS();
     532  Print("%s\n", s);
     533  omFree(s);
     534  return c;
     535}
     536number _nrzMult (number a, number b, const coeffs R)
     537#else
     538number nrzMult (number a, number b, const coeffs R)
     539#endif
     540{
     541  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) {
     542  //from longrat.cc
     543    if (SR_TO_INT(a)==0)
     544      return a;
     545    if (SR_TO_INT(b)==0)
     546      return b;
     547    long r=(long)((unsigned long)(SR_HDL(a)-1L))*((unsigned long)(SR_HDL(b)>>1));
     548    if ((r/(SR_HDL(b)>>1))==(SR_HDL(a)-1L))
     549    {
     550      number u=((number) ((r>>1)+SR_INT));
     551    //  if (((((long)SR_HDL(u))<<1)>>1)==SR_HDL(u)) return (u);
     552      return nrzInit(SR_HDL(u)>>2, R);
     553    }
     554    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     555    mpz_init(erg);
     556    mpz_set_si(erg, SR_TO_INT(a));
     557    mpz_mul_si(erg, erg, SR_TO_INT(b));
     558    nrzTest((number)erg);
     559    return (number) erg;
     560  }
     561  else if (n_Z_IS_SMALL(a))
     562  {
     563    if (SR_TO_INT(a)==0)
     564      return a;
     565    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     566    mpz_init_set(erg, (int_number) b);
     567    mpz_mul_si(erg, erg, SR_TO_INT(a));
     568    nrzTest((number)erg);
     569    return (number) erg;
     570  }
     571  else if (n_Z_IS_SMALL(b))
     572  {
     573    if (SR_TO_INT(b)==0)
     574      return b;
     575    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     576    mpz_init_set(erg, (int_number) a);
     577    mpz_mul_si(erg, erg, SR_TO_INT(b));
     578    nrzTest((number)erg);
     579    return (number) erg;
     580  }
     581  else
     582  {
     583    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     584    mpz_init(erg);
     585    mpz_mul(erg, (int_number) a, (int_number) b);
     586    nrzTest((number)erg);
     587    return (number) erg;
     588  }
     589}
     590
     591
     592static int int_gcd(int a, int b)
     593{
     594  int r;
     595  a = ABS(a);
     596  b = ABS(b);
     597  if (!a) return b;
     598  if (!b) return a;
     599  do
     600  {
     601    r = a % b;
     602    a = b;
     603    b = r;
     604  } while (b);
     605  return ABS(a); // % in c doeas not imply a signn
     606                 // it would be unlikely to see a negative here
     607                 // but who knows
     608}
     609
     610/*
     611 * Give the smallest non unit k, such that a * x = k = b * y has a solution
     612 */
     613number nrzLcm (number a, number b, const coeffs R)
     614{
     615  PrintS("nrzLcm\n");
     616  int_number erg;
     617  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     618  {
     619    int g = int_gcd(SR_TO_INT(a), SR_TO_INT(b));
     620    return nrzMult(a, INT_TO_SR(SR_TO_INT(b)/g), R);
     621  }
     622  else if (n_Z_IS_SMALL(a))
     623  {
     624    erg = (int_number) omAllocBin(gmp_nrz_bin);
     625    mpz_init_set(erg, (int_number) b);
     626    unsigned long g = mpz_gcd_ui(NULL, erg, (unsigned long) ABS(SR_TO_INT(a)));
     627    mpz_mul_si(erg, erg, SR_TO_INT(a)/g);
     628  }
     629  else if (n_Z_IS_SMALL(b))
     630  {
     631    erg = (int_number) omAllocBin(gmp_nrz_bin);
     632    mpz_init_set(erg, (int_number) a);
     633    unsigned long g = mpz_gcd_ui(NULL, erg, (unsigned long) ABS(SR_TO_INT(b)));
     634    mpz_mul_si(erg, erg, SR_TO_INT(b)/g);
     635  }
     636  else
     637  {
     638    erg = (int_number) omAllocBin(gmp_nrz_bin);
     639    mpz_init(erg);
     640    mpz_lcm(erg, (int_number) a, (int_number) b);
     641  }
     642  return (number) erg;
     643}
     644
     645/*
     646 * Give the largest non unit k, such that a = x * k, b = y * k has
     647 * a solution.
     648 */
     649number nrzGcd (number a,number b,const coeffs R)
     650{
     651  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     652  {
     653    int g = int_gcd(SR_TO_INT(a), SR_TO_INT(b));
     654    return INT_TO_SR(g);
     655  }
     656  else if (n_Z_IS_SMALL(a))
     657  {
     658    if (a==INT_TO_SR(0))
     659      return nrzCopy(b, R);
     660    unsigned long g = mpz_gcd_ui(NULL, (int_number)b, (unsigned long) ABS(SR_TO_INT(a)));
     661    return INT_TO_SR( g);
     662  }
     663  else if (n_Z_IS_SMALL(b))
     664  {
     665    if (b==INT_TO_SR(0))
     666      return nrzCopy(a, R);
     667    unsigned long g = mpz_gcd_ui(NULL, (int_number)a, (unsigned long) ABS(SR_TO_INT(b)));
     668    return INT_TO_SR(g);
     669  }
     670  else
     671  {
     672    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     673    mpz_init(erg);
     674    mpz_gcd(erg, (int_number) a, (int_number) b);
     675    return (number) erg;
     676  }
     677}
     678
     679/*
     680 * Give the largest non unit k, such that a = x * k, b = y * k has
     681 * a solution and r, s, s.t. k = s*a + t*b
     682 */
     683static int int_extgcd(int a, int b, int * u, int* x, int * v, int* y)
     684{
     685  int q, r;
     686  if (!a)
     687  {
     688    *u = 0;
     689    *v = 1;
     690    *x = -1;
     691    *y = 0;
     692    return b;
     693  }
     694  if (!b)
     695  {
     696    *u = 1;
     697    *v = 0;
     698    *x = 0;
     699    *y = 1;
     700    return a;
     701  }
     702  *u=1;
     703  *v=0;
     704  *x=0;
     705  *y=1;
     706  do
     707  {
     708    q = a/b;
     709    r = a%b;
     710    assume (q*b+r == a);
     711    a = b;
     712    b = r;
     713
     714    r = -(*v)*q+(*u);
     715    (*u) =(*v);
     716    (*v) = r;
     717
     718    r = -(*y)*q+(*x);
     719    (*x) = (*y);
     720    (*y) = r;
     721  } while (b);
     722
     723  return a;
     724}
     725
     726number  nrzExtGcd (number a, number b, number *s, number *t, const coeffs)
     727{
     728  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     729  {
     730    int u, v, x, y;
     731    int g = int_extgcd(SR_TO_INT(a), SR_TO_INT(b), &u, &v, &x, &y);
     732    *s = INT_TO_SR(u);
     733    *t = INT_TO_SR(v);
     734    return INT_TO_SR(g);
     735  }
     736  else
     737  {
     738    mpz_t aa, bb;
     739    if (n_Z_IS_SMALL(a))
     740    {
     741      mpz_init_set_si(aa, SR_TO_INT(a));
     742    }
     743    else
     744    {
     745      mpz_init_set(aa, (int_number) a);
     746    }
     747    if (n_Z_IS_SMALL(b))
     748    {
     749      mpz_init_set_si(bb, SR_TO_INT(b));
     750    }
     751    else
     752    {
     753      mpz_init_set(bb, (int_number) b);
     754    }
     755    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     756    int_number bs = (int_number) omAllocBin(gmp_nrz_bin);
     757    int_number bt = (int_number) omAllocBin(gmp_nrz_bin);
     758    mpz_init(erg);
     759    mpz_init(bs);
     760    mpz_init(bt);
     761    mpz_gcdext(erg, bs, bt, aa, bb);
     762    *s = nrz_short((number) bs);
     763    *t = nrz_short((number) bt);
     764    mpz_clear(aa);
     765    mpz_clear(bb);
     766    return nrz_short((number) erg);
     767  }
     768}
     769#if CF_DEBUG
     770number _nrzXExtGcd(number, number, number *, number *, number *, number *, const coeffs);
     771number nrzXExtGcd(number a, number b, number *x, number * y, number * u, number * v, const coeffs R)
     772{
     773  char * s;
     774  StringSetS("XExtGcd: ");
     775  nrzWrite(a, R);
     776  StringAppendS(" by ");
     777  nrzWrite(b, R);
     778  number c = _nrzXExtGcd(a, b, x, y, u, v, R);
     779  StringAppendS(" is ");
     780  nrzWrite(c, R);
     781  StringAppendS("[[");
     782  nrzWrite(*x, R);
     783  StringAppendS(", ");
     784  nrzWrite(*y, R);
     785  StringAppendS("], ");
     786  nrzWrite(*u, R);
     787  StringAppendS(", ");
     788  nrzWrite(*v, R);
     789  s=StringEndS();
     790  Print("%s]]\n", s);
     791  omFree(s);
     792  return c;
     793}
     794number  _nrzXExtGcd (number a, number b, number *s, number *t, number *u, number *v, const coeffs )
     795#else
     796number  nrzXExtGcd (number a, number b, number *s, number *t, number *u, number *v, const coeffs )
     797#endif
     798{
     799  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     800  {
     801    int uu, vv, x, y;
     802    int g = int_extgcd(SR_TO_INT(a), SR_TO_INT(b), &uu, &vv, &x, &y);
     803    *s = INT_TO_SR(uu);
     804    *t = INT_TO_SR(vv);
     805    *u = INT_TO_SR(x);
     806    *v = INT_TO_SR(y);
     807    return INT_TO_SR(g);
     808  }
     809  else
     810  {
     811    mpz_t aa, bb;
     812    if (n_Z_IS_SMALL(a))
     813    {
     814      mpz_init_set_si(aa, SR_TO_INT(a));
     815    }
     816    else
     817    {
     818      mpz_init_set(aa, (int_number) a);
     819    }
     820    if (n_Z_IS_SMALL(b))
     821    {
     822      mpz_init_set_si(bb, SR_TO_INT(b));
     823    }
     824    else
     825    {
     826      mpz_init_set(bb, (int_number) b);
     827    }
     828    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     829    int_number bs = (int_number) omAllocBin(gmp_nrz_bin);
     830    int_number bt = (int_number) omAllocBin(gmp_nrz_bin);
     831    mpz_init(erg);
     832    mpz_init(bs);
     833    mpz_init(bt);
     834
     835    mpz_gcdext(erg, bs, bt, aa, bb);
     836
     837    int_number bu = (int_number) omAllocBin(gmp_nrz_bin);
     838    int_number bv = (int_number) omAllocBin(gmp_nrz_bin);
     839
     840    mpz_init_set(bu, (int_number) bb);
     841    mpz_init_set(bv, (int_number) aa);
     842
     843    mpz_clear(aa);
     844    mpz_clear(bb);
     845    assume(mpz_cmp_si(erg, 0));
     846
     847    mpz_div(bu, bu, erg);
     848    mpz_div(bv, bv, erg);
     849
     850    mpz_mul_si(bu, bu, -1);
     851    *u = nrz_short((number) bu);
     852    *v = nrz_short((number) bv);
     853
     854    *s = nrz_short((number) bs);
     855    *t = nrz_short((number) bt);
     856    return nrz_short((number) erg);
     857  }
     858}
     859#if CF_DEBUG
     860number _nrzQuotRem(number, number, number *, const coeffs);
     861number nrzQuotRem(number a, number b, number * r, const coeffs R)
     862{
     863  StringSetS("QuotRem: ");
     864  nrzWrite(a, R);
     865  StringAppendS(" by ");
     866  nrzWrite(b, R);
     867  number c = _nrzQuotRem(a, b, r, R);
     868  StringAppendS(" is ");
     869  nrzWrite(c, R);
     870  if (r) {
     871    StringAppendS("+R(");
     872    nrzWrite(*r, R);
     873    StringAppendS(")");
     874  }
     875  char * s = StringEndS();
     876  Print("%s\n", s);
     877  omFree(s);
     878  return c;
     879}
     880number _nrzQuotRem (number a, number b, number * r, const coeffs )
     881#else
     882number nrzQuotRem (number a, number b, number * r, const coeffs )
     883#endif
     884{
     885  assume(SR_TO_INT(b));
     886  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     887  {
     888    if (r)
     889      *r = INT_TO_SR(SR_TO_INT(a) % SR_TO_INT(b));
     890    return INT_TO_SR(SR_TO_INT(a)/SR_TO_INT(b));
     891  }
     892  else if (n_Z_IS_SMALL(a))
     893  {
     894    //a is small, b is not, so q=0, r=a
     895    if (r)
     896      *r = a;
     897    return INT_TO_SR(0);
     898  }
     899  else if (n_Z_IS_SMALL(b))
     900  {
     901    unsigned long rr;
     902    int_number qq = (int_number) omAllocBin(gmp_nrz_bin);
     903    mpz_init(qq);
     904    mpz_t rrr;
     905    mpz_init(rrr);
     906    rr = mpz_divmod_ui(qq, rrr, (int_number) a, (unsigned long)ABS(SR_TO_INT(b)));
     907    mpz_clear(rrr);
     908
     909    if (r)
     910      *r = INT_TO_SR(rr);
     911    if (SR_TO_INT(b)<0)
     912    {
     913      mpz_mul_si(qq, qq, -1);
     914    }
     915    return nrz_short((number)qq);
     916  }
     917  int_number qq = (int_number) omAllocBin(gmp_nrz_bin),
     918             rr = (int_number) omAllocBin(gmp_nrz_bin);
     919  mpz_init(qq);
     920  mpz_init(rr);
     921  mpz_divmod(qq, rr, (int_number)a, (int_number)b);
     922  if (r)
     923    *r = (number) rr;
     924  else
     925  {
     926    mpz_clear(rr);
     927  }
     928  nrzTest((number)qq);
     929  return (number) qq;
     930}
     931
     932
     933void nrzPower (number a, int i, number * result, const coeffs)
     934{
     935  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     936  mpz_init(erg);
     937  mpz_t aa;
     938  if (n_Z_IS_SMALL(a))
     939    mpz_init_set_si(aa, SR_TO_INT(a));
     940  else
     941    mpz_init_set(aa, (int_number) a);
     942  mpz_pow_ui(erg, aa, i);
     943  *result = nrz_short((number) erg);
     944}
     945
     946/*
     947 * create a number from int
     948 * TODO: do not create an mpz if not necessary
     949 */
     950number nrzInit (long i, const coeffs)
     951{
     952  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     953  mpz_init_set_si(erg, i);
     954  return nrz_short((number) erg);
     955}
     956
     957void nrzDelete(number *a, const coeffs)
     958{
     959  if (*a == NULL) return;
     960  if (n_Z_IS_SMALL(*a)==0)
     961  {
     962    mpz_clear((int_number) *a);
     963    omFreeBin((ADDRESS) *a, gmp_nrz_bin);
     964  }
     965  *a = NULL;
     966}
     967
     968number nrzCopy(number a, const coeffs)
     969{
     970  if (n_Z_IS_SMALL(a)) return a;
     971  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     972  mpz_init_set(erg, (int_number) a);
     973  return (number) erg;
     974}
     975
     976int nrzSize(number a, const coeffs)
     977{
     978  if (a == NULL) return 0;
     979  if (n_Z_IS_SMALL(a)) return 1;
     980  return mpz_size1((int_number)a)+1;
     981}
     982
     983/*
     984 * convert a number to int
     985 */
     986int nrzInt(number &n, const coeffs)
     987{
     988  if (n_Z_IS_SMALL(n)) return SR_TO_INT(n);
     989  return (int) mpz_get_si( (int_number)n);
     990}
     991#if CF_DEBUG
     992number _nrzAdd(number, number, const coeffs);
     993number nrzAdd(number a, number b, const coeffs R)
     994{
     995  StringSetS("Add: ");
     996  nrzWrite(a, R);
     997  StringAppendS(" to ");
     998  nrzWrite(b, R);
     999  number c = _nrzAdd(a, b, R);
     1000  StringAppendS(" is ");
     1001  nrzWrite(c, R);
     1002  char * s = StringEndS();
     1003  Print("%s\n", s);
     1004  omFree(s);
     1005  return c;
     1006}
     1007number _nrzAdd (number a, number b, const coeffs R)
     1008#else
     1009number nrzAdd (number a, number b, const coeffs R)
     1010#endif
     1011{
     1012  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1013  {
     1014    int c = SR_TO_INT(a) + SR_TO_INT(b);
     1015    if (INT_IS_SMALL(c))
     1016      return INT_TO_SR(c);
     1017    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1018    mpz_init_set_si(erg, c);
     1019
     1020    nrzTest((number)erg);
     1021    return (number) erg;
     1022  }
     1023  else if (n_Z_IS_SMALL(a))
     1024  {
     1025    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1026    mpz_init(erg);
     1027    if (SR_TO_INT(a)>0)
     1028      mpz_add_ui(erg, (int_number) b, (unsigned long)SR_TO_INT(a));
     1029    else
     1030      mpz_sub_ui(erg, (int_number) b, (unsigned long)-(SR_TO_INT(a)));
     1031    return nrz_short((number) erg);
     1032  }
     1033  else if (n_Z_IS_SMALL(b))
     1034  {
     1035    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1036    mpz_init(erg);
     1037    if (SR_TO_INT(b)>0)
     1038      mpz_add_ui(erg, (int_number) a, (unsigned long)SR_TO_INT(b));
     1039    else
     1040      mpz_sub_ui(erg, (int_number) a, (unsigned long)-(SR_TO_INT(b)));
     1041    return nrz_short((number) erg);
     1042  }
     1043  else
     1044  {
     1045    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1046    mpz_init(erg);
     1047    mpz_add(erg, (int_number) a, (int_number) b);
     1048    return nrz_short((number) erg);
     1049  }
     1050}
     1051
     1052number nrzSub (number a, number b, const coeffs)
     1053{
     1054  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1055  {
     1056    int c = SR_TO_INT(a) - SR_TO_INT(b);
     1057    if (INT_IS_SMALL(c))
     1058      return INT_TO_SR(c);
     1059    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1060    mpz_init_set_si(erg, c);
     1061    nrzTest((number)erg);
     1062    return (number) erg;
     1063  }
     1064  else if (n_Z_IS_SMALL(a))
     1065  {
     1066    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1067    mpz_init(erg);
     1068
     1069    if (SR_TO_INT(a)>0)
     1070      mpz_ui_sub(erg, (unsigned long)SR_TO_INT(a), (int_number) b);
     1071    else
     1072    {
     1073      mpz_add_ui(erg, (int_number) b, (unsigned long)-SR_TO_INT(a));
     1074      mpz_neg(erg, erg);
     1075    }
     1076    return nrz_short((number) erg);
     1077  }
     1078  else if (n_Z_IS_SMALL(b))
     1079  {
     1080    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1081    mpz_init(erg);
     1082    if (INT_TO_SR(b)>0)
     1083      mpz_sub_ui(erg, (int_number) a, (unsigned long)SR_TO_INT(b));
     1084    else
     1085      mpz_add_ui(erg, (int_number) a, (unsigned long)-SR_TO_INT(b));
     1086    return nrz_short((number) erg);
     1087  }
     1088  else
     1089  {
     1090    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1091    mpz_init(erg);
     1092    mpz_sub(erg, (int_number) a, (int_number) b);
     1093    return nrz_short((number) erg);
     1094  }
     1095}
     1096
     1097number  nrzGetUnit (number n, const coeffs r)
     1098{
     1099  //if (n_Z_IS_SMALL(n))
     1100  //{
     1101  //  if (SR_TO_INT(n)<0)
     1102  //    return INT_TO_SR(-1);
     1103  //  else
     1104  //    return INT_TO_SR(1);
     1105  //}
     1106  if (nrzGreaterZero(n, r))
     1107    return INT_TO_SR(1);
     1108  else
     1109    return INT_TO_SR(-1);
     1110}
     1111
     1112number nrzAnn(number n, const coeffs)
     1113{
     1114  if (SR_TO_INT(n))  // in Z: the annihilator of !=0 is 0
     1115    return INT_TO_SR(0);
     1116  else
     1117    return INT_TO_SR(1);
     1118}
     1119
     1120BOOLEAN nrzIsUnit (number a, const coeffs)
     1121{
     1122  return ABS(SR_TO_INT(a))==1;
     1123}
     1124
     1125BOOLEAN nrzIsZero (number  a, const coeffs)
     1126{
     1127  return a==INT_TO_SR(0);
     1128}
     1129
     1130BOOLEAN nrzIsOne (number a, const coeffs)
     1131{
     1132  return a==INT_TO_SR(1);
     1133}
     1134
     1135BOOLEAN nrzIsMOne (number a, const coeffs)
     1136{
     1137  return a==INT_TO_SR(-1);
     1138}
     1139
     1140BOOLEAN nrzEqual (number a,number b, const coeffs)
     1141{
     1142  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1143    return a==b;
     1144  else if (n_Z_IS_SMALL(a) || n_Z_IS_SMALL(b))
     1145    return FALSE;
     1146  else
     1147    return 0 == mpz_cmp((int_number) a, (int_number) b);
     1148}
     1149
     1150BOOLEAN nrzGreater (number a,number b, const coeffs)
     1151{
     1152  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1153    return ((long)a)>((long)b);
     1154  else if (n_Z_IS_SMALL(a))
     1155    return 0 > mpz_cmp_si((int_number)b,SR_TO_INT(a));
     1156  else if (n_Z_IS_SMALL(b))
     1157    return 0 < mpz_cmp_si((int_number)a,SR_TO_INT(b));
     1158  return 0 < mpz_cmp((int_number) a, (int_number) b);
     1159}
     1160
     1161BOOLEAN nrzGreaterZero (number k, const coeffs C)
     1162{
     1163  return nrzGreater(k, INT_TO_SR(0), C);
     1164}
     1165
     1166int nrzDivComp(number a, number b, const coeffs r)
     1167{
     1168  if (nrzDivBy(a, b, r))
     1169  {
     1170    if (nrzDivBy(b, a, r)) return 2;
     1171    return -1;
     1172  }
     1173  if (nrzDivBy(b, a, r)) return 1;
     1174  return 0;
     1175}
     1176
     1177BOOLEAN nrzDivBy (number a,number b, const coeffs)
     1178{
     1179  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1180  {
     1181    return SR_TO_INT(a) %SR_TO_INT(b) ==0;
     1182  }
     1183  else if (n_Z_IS_SMALL(a))
     1184  {
     1185    return a==INT_TO_SR(0);
     1186  }
     1187  else if (n_Z_IS_SMALL(b))
     1188  {
     1189    return mpz_divisible_ui_p((int_number)a, (unsigned long)ABS(SR_TO_INT(b))) != 0;
     1190  }
     1191  else
     1192    return mpz_divisible_p((int_number) a, (int_number) b) != 0;
     1193}
     1194
     1195number nrzDiv (number a,number b, const coeffs R)
     1196{
     1197  assume(SR_TO_INT(b));
     1198  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1199  {
     1200    //if (SR_TO_INT(a) % SR_TO_INT(b))
     1201    //{
     1202    //  WerrorS("1:Division by non divisible element.");
     1203    //  WerrorS("Result is without remainder.");
     1204    //}
     1205    return INT_TO_SR(SR_TO_INT(a)/SR_TO_INT(b));
     1206  }
     1207  else if (n_Z_IS_SMALL(a))
     1208  {
     1209    //if (SR_TO_INT(a))
     1210    //{
     1211    //  WerrorS("2:Division by non divisible element.");
     1212    //  WerrorS("Result is without remainder.");
     1213    //}
     1214    return INT_TO_SR(0);
     1215  }
     1216  else if (n_Z_IS_SMALL(b))
     1217  {
     1218    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1219    mpz_t r;
     1220    mpz_init(r);
     1221    mpz_init(erg);
     1222    if (mpz_divmod_ui(erg, r, (int_number) a, (unsigned long)ABS(SR_TO_INT(b)))) {
     1223    //  WerrorS("3:Division by non divisible element.");
     1224    //  WerrorS("Result is without remainder.");
     1225    }
     1226    mpz_clear(r);
     1227    if (SR_TO_INT(b)<0)
     1228      mpz_neg(erg, erg);
     1229    return nrz_short((number) erg);
     1230  }
     1231  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1232  mpz_init(erg);
     1233  mpz_t r;
     1234  mpz_init(r);
     1235  mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b);
     1236#if CF_DEBUG
     1237  StringSetS("division of");
     1238  nrzWrite(a, R);
     1239  StringAppendS(" by ");
     1240  nrzWrite(b, R);
     1241  StringAppendS(" is ");
     1242  number du;
     1243  nrzWrite(du = (number)erg, R);
     1244  StringAppendS(" rest ");
     1245  nrzWrite(du = (number)r, R);
     1246  char * s = StringEndS();
     1247  Print("%s\n", s);
     1248  omFree(s);
     1249#endif
     1250
     1251  if (mpz_cmp_si(r, 0)!=0)
     1252  {
     1253    //WerrorS("4:Division by non divisible element.");
     1254    //WerrorS("Result is without remainder.");
     1255  }
     1256  mpz_clear(r);
     1257  return nrz_short((number) erg);
     1258}
     1259
     1260number nrzExactDiv (number a,number b, const coeffs)
     1261{
     1262  assume(SR_TO_INT(b));
     1263  mpz_t aa, bb;
     1264  if (n_Z_IS_SMALL(a))
     1265    mpz_init_set_si(aa, SR_TO_INT(a));
     1266  else
     1267    mpz_init_set(aa, (int_number) a);
     1268  if (n_Z_IS_SMALL(b))
     1269    mpz_init_set_si(bb, SR_TO_INT(b));
     1270  else
     1271    mpz_init_set(bb, (int_number) b);
     1272  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1273  mpz_init(erg);
     1274  mpz_tdiv_q(erg, (int_number) aa, (int_number) bb);
     1275  mpz_clear(aa);
     1276  mpz_clear(bb);
     1277  nrzTest((number)erg);
     1278  return (number) erg;
     1279}
     1280
     1281number nrzIntMod (number a,number b, const coeffs)
     1282{
     1283  mpz_t aa, bb;
     1284  assume(SR_TO_INT(b));
     1285  if (n_Z_IS_SMALL(a))
     1286    mpz_init_set_si(aa, SR_TO_INT(a));
     1287  else
     1288    mpz_init_set(aa, (int_number) a);
     1289  if (n_Z_IS_SMALL(b))
     1290    mpz_init_set_si(bb, SR_TO_INT(b));
     1291  else
     1292    mpz_init_set(bb, (int_number) b);
     1293
     1294  mpz_t erg;
     1295  mpz_init(erg);
     1296  int_number r = (int_number) omAllocBin(gmp_nrz_bin);
     1297  mpz_init(r);
     1298  mpz_tdiv_qr(erg, r, (int_number) aa, (int_number) bb);
     1299  mpz_clear(erg);
     1300  mpz_clear(aa);
     1301  mpz_clear(bb);
     1302 
     1303  return nrz_short((number) r);
     1304}
     1305
     1306number  nrzInvers (number c, const coeffs r)
     1307{
     1308  if (!nrzIsUnit((number) c, r))
     1309  {
     1310    WerrorS("Non invertible element.");
     1311    return (number)0; //TODO
     1312  }
     1313  return c; // has to be 1 or -1....
     1314}
     1315
     1316number nrzNeg (number c, const coeffs)
     1317{
     1318// nNeg inplace !!!
     1319  if (n_Z_IS_SMALL(c))
     1320    return INT_TO_SR(-SR_TO_INT(c));
     1321  mpz_mul_si((int_number) c, (int_number) c, -1);
     1322  return c;
     1323}
     1324
     1325static number nrzFarey(number r, number N, const coeffs R)
     1326{
     1327  number a0 = nrzCopy(N, R);
     1328  number b0 = nrzInit(0, R);
     1329  number a1 = nrzCopy(r, R);
     1330  number b1 = nrzInit(1, R);
     1331  number two = nrzInit(2, R);
     1332#if 0
     1333  Print("Farey start with ");
     1334  n_Print(r, R);
     1335  Print(" mod ");
     1336  n_Print(N, R);
     1337  Print("\n");
     1338#endif
     1339  while (1)
     1340  {
     1341    number as = nrzMult(a1, a1, R);
     1342    n_InpMult(as, two, R);
     1343    if (nrzGreater(N, as, R))
     1344    {
     1345      nrzDelete(&as, R);
     1346      break;
     1347    }
     1348    nrzDelete(&as, R);
     1349    number q = nrzDiv(a0, a1, R);
     1350    number t = nrzMult(a1, q, R),
     1351           s = nrzSub(a0, t, R);
     1352    nrzDelete(&a0, R);
     1353    a0 = a1;
     1354    a1 = s;
     1355    nrzDelete(&t, R);
     1356
     1357    t = nrzMult(b1, q, R);
     1358    s = nrzSub(b0, t, R);
     1359    nrzDelete(&b0, R);
     1360    b0 = b1;
     1361    b1 = s;
     1362    nrzDelete(&t, R);
     1363    nrzDelete(&q, R);
     1364  }
     1365  number as = nrzMult(b1, b1, R);
     1366  n_InpMult(as, two, R);
     1367  nrzDelete(&two, R);
     1368  if (nrzGreater(as, N, R))
     1369  {
     1370    nrzDelete(&a0, R);
     1371    nrzDelete(&a1, R);
     1372    nrzDelete(&b0, R);
     1373    nrzDelete(&b1, R);
     1374    nrzDelete(&as, R);
     1375    return NULL;
     1376  }
     1377  nrzDelete(&as, R);
     1378  nrzDelete(&a0, R);
     1379  nrzDelete(&b0, R);
     1380
     1381  number a, b, ab;
     1382  coeffs Q = nInitChar(n_Q, 0);
     1383  nMapFunc f = n_SetMap(R, Q);
     1384  a = f(a1, R, Q);
     1385  b = f(b1, R, Q);
     1386  ab = n_Div(a, b, Q);
     1387  n_Delete(&a, Q);
     1388  n_Delete(&b, Q);
     1389  nKillChar(Q);
     1390
     1391  nrzDelete(&a1, R);
     1392  nrzDelete(&b1, R);
     1393  return ab;
     1394}
     1395
     1396number nrzMapMachineInt(number from, const coeffs /*src*/, const coeffs /*dst*/)
     1397{
     1398  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1399  mpz_init_set_ui(erg, (NATNUMBER) from);
     1400  return nrz_short((number) erg);
     1401}
     1402
     1403number nrzMapZp(number from, const coeffs /*src*/, const coeffs /*dst*/)
     1404{
     1405  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1406  mpz_init_set_si(erg, (long) from);
     1407  return nrz_short((number) erg);
     1408}
     1409
     1410number nrzModNMap(number from, const coeffs src, const coeffs /*dst*/)
     1411{
     1412  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1413  mpz_init_set(erg, (int_number) from);
     1414  return nrz_short((number) erg);
     1415}
     1416
     1417number nrzMapQ(number from, const coeffs src, const coeffs dst)
     1418{
     1419  if (SR_HDL(from) & SR_INT)
     1420    return nrzInit(SR_TO_INT(from),dst);
     1421  if (from->s!=3)
     1422  {
     1423    WerrorS("rational in map to integer");
     1424    return NULL;
     1425  }
     1426  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1427  mpz_init_set(erg, from->z);
     1428  return nrz_short((number) erg);
     1429}
     1430
     1431nMapFunc nrzSetMap(const coeffs src, const coeffs /*dst*/)
     1432{
     1433  /* dst = rintegers */
     1434  if (src->rep==n_rep_gmp) //nCoeff_is_Ring_ModN(src) || nCoeff_is_Ring_PtoM(src))
     1435    return nrzModNMap;
     1436
     1437  if ((src->rep==n_rep_gap_gmp) && nCoeff_is_Ring_Z(src))
     1438  {
     1439    return ndCopyMap; //nrzCopyMap;
     1440  }
     1441  if (src->rep==n_rep_gap_rat) /*&& nCoeff_is_Ring_Z(src)) Q, bigint*/
     1442  {
     1443    return nrzMapQ;
     1444  }
     1445  if ((src->rep=n_rep_int) && nCoeff_is_Ring_2toM(src))
     1446  {
     1447    return nrzMapMachineInt;
     1448  }
     1449  if ((src->rep=n_rep_int) && nCoeff_is_Zp(src))
     1450  {
     1451    return nrzMapZp;
     1452  }
     1453  return NULL;      // default
     1454}
     1455
     1456
     1457/*
     1458 * set the exponent (allocate and init tables) (TODO)
     1459 */
     1460
     1461void nrzSetExp(int, coeffs)
     1462{
     1463}
     1464
     1465void nrzInitExp(int, coeffs)
     1466{
     1467}
     1468
     1469#ifdef LDEBUG
     1470BOOLEAN nrzDBTest (number x, const char *f, const int l, const coeffs)
     1471{
     1472  if (SR_HDL(x) & SR_INT) return TRUE;
     1473  if (mpz_cmp_ui((int_number) x,(long)0)==0)
     1474  {
     1475    Print("gmp-0 %s:%d\n",f,l);
     1476    return FALSE;
     1477  }
     1478  if (mpz_size1((int_number)x)<=MP_SMALL)
     1479  {
     1480    int ui=mpz_get_si((int_number)x);
     1481    if ((((ui<<3)>>3)==ui)
     1482    && (mpz_cmp_si((int_number)x,(long)ui)==0))
     1483    {
     1484      Print("gmp-small %s:%d\n",f,l);
     1485      return FALSE;
     1486    }
     1487  }
     1488  return TRUE;
     1489}
     1490#endif
     1491
     1492void nrzWrite (number &a, const coeffs)
     1493{
     1494  char *s,*z;
     1495  if (a==NULL)
     1496  {
     1497    StringAppendS("o");
     1498  }
     1499  else
     1500  {
     1501    if (n_Z_IS_SMALL(a))
     1502    {
     1503      StringAppend("%d", SR_TO_INT(a));
     1504    }
     1505    else
     1506    {
     1507      int l=mpz_sizeinbase((int_number) a, 10) + 2;
     1508      s=(char*)omAlloc(l);
     1509      z=mpz_get_str(s,10,(int_number) a);
     1510      StringAppendS(z);
     1511      omFreeSize((ADDRESS)s,l);
     1512    }
     1513  }
     1514}
     1515
     1516/*2
     1517* extracts a long integer from s, returns the rest    (COPY FROM longrat0.cc)
     1518*/
     1519static const char * nlEatLongC(char *s, mpz_ptr i)
     1520{
     1521  const char * start=s;
     1522
     1523  if (*s<'0' || *s>'9')
     1524  {
     1525    mpz_set_si(i,1);
     1526    return s;
     1527  }
     1528  while (*s >= '0' && *s <= '9') s++;
     1529  if (*s=='\0')
     1530  {
     1531    mpz_set_str(i,start,10);
     1532  }
     1533  else
     1534  {
     1535    char c=*s;
     1536    *s='\0';
     1537    mpz_set_str(i,start,10);
     1538    *s=c;
     1539  }
     1540  return s;
     1541}
     1542
     1543const char * nrzRead (const char *s, number *a, const coeffs)
     1544{
     1545  int_number z = (int_number) omAllocBin(gmp_nrz_bin);
     1546  {
     1547    mpz_init(z);
     1548    s = nlEatLongC((char *) s, z);
     1549  }
     1550  *a = nrz_short((number) z);
     1551  return s;
     1552}
     1553
     1554void    nrzCoeffWrite  (const coeffs, BOOLEAN /*details*/)
     1555{
     1556  //PrintS("// ZZ\n");
     1557  PrintS("//   coeff. ring is : Integers\n");
     1558}
     1559
     1560static char* nrzCoeffString(const coeffs)
     1561{
     1562  return omStrDup("integer");
     1563}
     1564
     1565static CanonicalForm nrzConvSingNFactoryN( number n, BOOLEAN setChar, const coeffs /*r*/ )
     1566{
     1567  if (setChar) setCharacteristic( 0 );
     1568
     1569  CanonicalForm term;
     1570  if ( n_Z_IS_SMALL(n))
     1571  {
     1572    term = SR_TO_INT(n);
     1573  }
     1574  else
     1575  {
     1576    mpz_t dummy;
     1577    mpz_init_set( dummy,n->z );
     1578    term = make_cf( dummy );
     1579  }
     1580  return term;
     1581}
     1582
     1583static number nrzConvFactoryNSingN( const CanonicalForm n, const coeffs r)
     1584{
     1585  if (n.isImm())
     1586  {
     1587    return nrzInit(n.intval(),r);
     1588  }
     1589  else
     1590  {
     1591    if ( !n.den().isOne() )
     1592    {
     1593     WerrorS("rational in conversion to integer");
     1594     return NULL;
     1595    }
     1596    int_number z = (int_number) omAlloc0Bin(gmp_nrz_bin);
     1597    gmp_numerator( n,z);
     1598    return nrz_short((number)z);
     1599  }
     1600}
     1601
     1602static void nrzMPZ(mpz_t res, number &a, const coeffs)
     1603{
     1604  if (n_Z_IS_SMALL(a))
     1605    mpz_init_set_si(res, SR_TO_INT(a));
     1606  else
     1607    mpz_init_set(res, (int_number) a);
     1608}
     1609
     1610coeffs nrzQuot1(number c, const coeffs r)
     1611{
     1612    int_number dummy;
     1613    dummy = (int_number) omAlloc(sizeof(mpz_t));
     1614    if(n_Z_IS_SMALL(c))
     1615    {
     1616      int ch = r->cfInt(c, r);
     1617      mpz_init_set_ui(dummy, ch);
     1618    }
     1619    else
     1620    {
     1621      mpz_init_set(dummy, (int_number)c);
     1622    }
     1623    ZnmInfo info;
     1624    info.base = dummy;
     1625    info.exp = (unsigned long) 1;
     1626    coeffs rr = nInitChar(n_Zn, (void*)&info);
     1627    return(rr);
     1628}
     1629
     1630BOOLEAN nrzInitChar(coeffs r,  void *)
     1631{
     1632  assume( getCoeffType(r) == ID );
     1633
     1634  r->is_field=FALSE;
     1635  r->is_domain=TRUE;
     1636  r->rep=n_rep_gap_gmp;
     1637
     1638  r->nCoeffIsEqual = ndCoeffIsEqual;
     1639  r->cfCoeffString = nrzCoeffString;
     1640  r->cfKillChar = ndKillChar;
     1641  r->cfMult  = nrzMult;
     1642  r->cfSub   = nrzSub;
     1643  r->cfAdd   = nrzAdd;
     1644  r->cfDiv   = nrzDiv;
     1645  r->cfIntMod= nrzIntMod;
     1646  r->cfExactDiv= nrzExactDiv;
     1647  r->cfInit = nrzInit;
     1648  r->cfSize  = nrzSize;
     1649  r->cfInt  = nrzInt;
     1650  //#ifdef HAVE_RINGS
     1651  r->cfDivComp = nrzDivComp; // only for ring stuff
     1652  r->cfIsUnit = nrzIsUnit; // only for ring stuff
     1653  r->cfGetUnit = nrzGetUnit; // only for ring stuff
     1654  r->cfAnn = nrzAnn;
     1655  r->cfExtGcd = nrzExtGcd; // only for ring stuff
     1656  r->cfXExtGcd = nrzXExtGcd; // only for ring stuff
     1657  r->cfQuotRem = nrzQuotRem;
     1658  r->cfDivBy = nrzDivBy; // only for ring stuff
     1659  //#endif
     1660  r->cfInpNeg   = nrzNeg;
     1661  r->cfInvers= nrzInvers;
     1662  r->cfCopy  = nrzCopy;
     1663  r->cfWriteLong = nrzWrite;
     1664  r->cfRead = nrzRead;
     1665  r->cfGreater = nrzGreater;
     1666  r->cfEqual = nrzEqual;
     1667  r->cfIsZero = nrzIsZero;
     1668  r->cfIsOne = nrzIsOne;
     1669  r->cfIsMOne = nrzIsMOne;
     1670  r->cfGreaterZero = nrzGreaterZero;
     1671  r->cfPower = nrzPower;
     1672  r->cfGcd  = nrzGcd;
     1673  //r->cfLcm  = nrzLcm;
     1674  r->cfDelete= nrzDelete;
     1675  r->cfSetMap = nrzSetMap;
     1676  r->cfCoeffWrite = nrzCoeffWrite;
     1677  r->convSingNFactoryN = nrzConvSingNFactoryN;
     1678  r->convFactoryNSingN = nrzConvFactoryNSingN;
     1679  r->cfMPZ = nrzMPZ;
     1680  r->cfFarey = nrzFarey;
     1681
     1682  r->cfQuot1 = nrzQuot1;
     1683  // debug stuff
     1684
     1685#ifdef LDEBUG
     1686  r->cfDBTest=nrzDBTest;
     1687#endif
     1688
     1689  r->nNULL = 0;
     1690  r->ch = 0;
     1691  r->has_simple_Alloc=FALSE;
     1692  r->has_simple_Inverse=FALSE;
     1693  return FALSE;
     1694}
     1695
     1696#else
     1697#error set SI_INTEGER_VARIANT
     1698#endif
     1699#endif
  • libpolys/coeffs/rmodulo2m.cc

    r653440 r6a1aa7  
    105105  r->is_field=FALSE;
    106106  r->is_domain=FALSE;
     107  r->rep=n_rep_int;
    107108
    108109  r->cfKillChar    = ndKillChar; /* dummy*/
     
    151152  r->cfName        = ndName;
    152153  r->cfCoeffWrite  = nr2mCoeffWrite;
    153   r->cfInit_bigint = nr2mMapQ;
    154154  r->cfQuot1       = nr2mQuot1;
    155155#ifdef LDEBUG
     
    682682}
    683683
     684number nr2mMapZ(number from, const coeffs src, const coeffs dst)
     685{
     686  if (SR_HDL(from) & SR_INT)
     687  {
     688    long f_i=SR_TO_INT(from);
     689    return nr2mInit(f_i,dst);
     690  }
     691  return nr2mMapGMP(from,src,dst);
     692}
     693
    684694nMapFunc nr2mSetMap(const coeffs src, const coeffs dst)
    685695{
    686   if (nCoeff_is_Ring_2toM(src)
     696  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src)
    687697     && (src->mod2mMask == dst->mod2mMask))
    688698  {
    689699    return ndCopyMap;
    690700  }
    691   if (nCoeff_is_Ring_2toM(src)
     701  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src)
    692702     && (src->mod2mMask < dst->mod2mMask))
    693703  { /* i.e. map an integer mod 2^s into Z mod 2^t, where t < s */
    694704    return nr2mMapMachineInt;
    695705  }
    696   if (nCoeff_is_Ring_2toM(src)
     706  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src)
    697707     && (src->mod2mMask > dst->mod2mMask))
    698708  { /* i.e. map an integer mod 2^s into Z mod 2^t, where t > s */
     
    700710    return nr2mMapProject;
    701711  }
    702   if (nCoeff_is_Ring_Z(src))
     712  if ((src->rep==n_rep_gmp) && nCoeff_is_Ring_Z(src))
    703713  {
    704714    return nr2mMapGMP;
    705715  }
    706   if (nCoeff_is_Q(src))
     716  if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Ring_Z(src)*/)
     717  {
     718    return nr2mMapZ;
     719  }
     720  if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(src))
    707721  {
    708722    return nr2mMapQ;
    709723  }
    710   if (nCoeff_is_Zp(src) && (src->ch == 2))
     724  if ((src->rep=n_rep_int) && nCoeff_is_Zp(src) && (src->ch == 2))
    711725  {
    712726    return nr2mMapZp;
    713727  }
    714   if (nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
     728  if ((src->rep=n_rep_gmp) &&
     729  (nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src)))
    715730  {
    716731    if (mpz_divisible_2exp_p(src->modNumber,dst->modExponent))
  • libpolys/coeffs/rmodulon.cc

    r653440 r6a1aa7  
    120120  r->is_field=FALSE;
    121121  r->is_domain=FALSE;
     122  r->rep=n_rep_gmp;
    122123
    123124
     
    159160  r->cfCoeffWrite  = nrnCoeffWrite;
    160161  r->nCoeffIsEqual = nrnCoeffsEqual;
    161   r->cfInit_bigint = nrnMapQ;
    162162  r->cfKillChar    = ndKillChar;
    163163  r->cfQuot1       = nrnQuot1;
     
    554554}
    555555
     556number nrnMapZ(number from, const coeffs src, const coeffs dst)
     557{
     558  if (SR_HDL(from) & SR_INT)
     559  {
     560    long f_i=SR_TO_INT(from);
     561    return nrnInit(f_i,dst);
     562  }
     563  return nrnMapGMP(from,src,dst);
     564}
     565
    556566number nrnMapQ(number from, const coeffs src, const coeffs dst)
    557567{
     
    565575nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
    566576{
    567   /* dst = currRing->cf */
    568   if (nCoeff_is_Ring_Z(src))
     577  /* dst = nrn */
     578  if ((src->rep==n_rep_gmp) && nCoeff_is_Ring_Z(src))
    569579  {
    570580    return nrnMapGMP;
    571581  }
    572   if (nCoeff_is_Q(src))
     582  if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Ring_Z(src)*/)
     583  {
     584    return nrnMapZ;
     585  }
     586  if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(src))
    573587  {
    574588    return nrnMapQ;
  • libpolys/coeffs/shortfl.cc

    r653440 r6a1aa7  
    430430
    431431  assume( getCoeffType(r) == ID );
    432   assume( getCoeffType(aRing) == n_Q );
     432  assume( aRing->rep == n_rep_gap_rat );
    433433
    434434  mpz_ptr z;
    435435  mpz_ptr zz=NULL;
    436   #if SIZEOF_LONG == 8
    437436  if (IS_IMM(from))
    438437  {
    439     int ui=SR_TO_INT(from);
    440      if ((long)ui==SR_TO_INT(from))
    441        return nf((float)ui).N();
    442438     zz=(mpz_ptr)omAlloc(sizeof(mpz_t));
    443439     mpz_init_set_si(zz,SR_TO_INT(from));
    444440     z=zz;
    445441  }
    446   #else
    447   if (IS_IMM(from))
    448     return nf((float)nlInt(from,aRing)).N();
    449   #endif
    450442  else
    451443  {
     
    461453  mpf_abs (e, e);
    462454
    463   #if SIZEOF_LONG == 8
    464455  if (zz!=NULL)
    465456  {
     
    467458    omFreeSize(zz,sizeof(mpz_t));
    468459  }
    469   #endif
    470460  /* if number was an integer, we are done*/
    471461  if(IS_IMM(from)|| IS_INT(from))
     
    509499  mpf_clear(d);
    510500  mpf_clear(q);
     501  return nf(f).N();
     502}
     503
     504number nrMapZ(number from, const coeffs aRing, const coeffs r)
     505{
     506  assume( getCoeffType(r) == ID );
     507  assume( aRing->rep == n_rep_gap_gmp );
     508
     509  mpz_ptr z;
     510  mpz_ptr zz=NULL;
     511  if (IS_IMM(from))
     512  {
     513     zz=(mpz_ptr)omAlloc(sizeof(mpz_t));
     514     mpz_init_set_si(zz,SR_TO_INT(from));
     515     z=zz;
     516  }
     517  else
     518  {
     519    /* read out the enumerator */
     520    z=(mpz_ptr)from;
     521  }
     522
     523  int i = mpz_size1(z);
     524  mpf_t e;
     525  mpf_init(e);
     526  mpf_set_z(e,z);
     527  int sign= mpf_sgn(e);
     528  mpf_abs (e, e);
     529
     530  if (zz!=NULL)
     531  {
     532    mpz_clear(zz);
     533    omFreeSize(zz,sizeof(mpz_t));
     534  }
     535  if(i>4)
     536  {
     537    WerrorS("float overflow");
     538    return nf(0.0).N();
     539  }
     540  double basis;
     541  signed long int exp;
     542  basis = mpf_get_d_2exp(&exp, e);
     543  float f= sign*ldexp(basis,exp);
     544  mpf_clear(e);
    511545  return nf(f).N();
    512546}
     
    631665  assume( getCoeffType(dst) == ID );
    632666
    633   if (nCoeff_is_Q(src))
     667  if (src->rep=n_rep_gap_rat) /*Q, Z */
    634668  {
    635669    return nrMapQ;
    636670  }
    637   if (nCoeff_is_long_R(src))
     671  if (src->rep=n_rep_gap_gmp) /*Q, Z */
     672  {
     673    return nrMapZ;
     674  }
     675  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    638676  {
    639677    return nrMapLongR;
    640678  }
    641   if (nCoeff_is_R(src))
     679  if ((src->rep==n_rep_float) && nCoeff_is_R(src))
    642680  {
    643681    return ndCopyMap;
    644682  }
    645   if(nCoeff_is_Zp(src))
     683  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src))
    646684  {
    647685    return nrMapP;
    648686  }
    649   if (nCoeff_is_long_C(src))
     687  if ((src->rep==n_rep_gmp_complex) && nCoeff_is_long_C(src))
    650688  {
    651689    return nrMapC;
     
    667705  n->is_field=TRUE;
    668706  n->is_domain=TRUE;
     707  n->rep=n_rep_float;
    669708
    670709  n->cfKillChar = ndKillChar; /* dummy */
     
    693732  n->cfSetMap = nrSetMap;
    694733  n->cfCoeffWrite  = nrCoeffWrite;
    695   n->cfInit_bigint = nrMapQ;
    696734
    697735    /* nName= ndName; */
  • libpolys/misc/auxiliary.h.in

    r653440 r6a1aa7  
    5454#endif
    5555
    56 #ifdef HAVE_FACTORY
    57 
    5856#ifndef SINGULAR
    5957#undef SINGULAR
     
    6462#endif
    6563
    66 #endif
    67 // #ifdef HAVE_FACTORY
    68 
    6964// ----------------  end of parts/extensions
    7065
    7166// ---------------- Singular standard types etc.
    72 // BOOLEAN
     67/* SI_INTEGER_VARIANT: 1: from longrat.cc
     68 *                     2: GMP
     69 *                     3: rintegers.cc */
     70#define SI_INTEGER_VARIANT 2
     71
     72/* SI_BIGINT_VARIANT: 1: from longrat.cc
     73 *                    2: given by SI_INTEGER_VARIANT */
     74#define SI_BIGINT_VARIANT 1
     75
    7376#ifndef SIZEOF_LONG
    7477
  • libpolys/polys/ext_fields/algext.cc

    r653440 r6a1aa7  
    350350}
    351351
    352 number naInit_bigint(number longratBigIntNumber, const coeffs src, const coeffs cf)
    353 {
    354   assume( cf != NULL );
    355 
    356   const ring A = cf->extRing;
    357 
    358   assume( A != NULL );
    359 
    360   const coeffs C = A->cf;
    361 
    362   assume( C != NULL );
    363 
    364   number n = n_Init_bigint(longratBigIntNumber, src, C);
    365 
    366   if ( n_IsZero(n, C) )
    367   {
    368     n_Delete(&n, C);
    369     return NULL;
    370   }
    371 
    372   return (number)p_NSet(n, A);
    373 }
    374 
    375 
    376 
    377352number naInit(long i, const coeffs cf)
    378353{
     
    889864}
    890865
    891 /* assumes that src = Q, dst = Q(a) */
     866/* assumes that src = Q or Z, dst = Q(a) */
    892867number naMap00(number a, const coeffs src, const coeffs dst)
    893868{
    894869  if (n_IsZero(a, src)) return NULL;
    895   assume(src == dst->extRing->cf);
     870  assume(src->rep == dst->extRing->cf->rep);
    896871  poly result = p_One(dst->extRing);
    897872  p_SetCoeff(result, n_Copy(a, src), dst->extRing);
     873  return (number)result;
     874}
     875
     876/* assumes that src = Z, dst = K(a) */
     877number naMapZ0(number a, const coeffs src, const coeffs dst)
     878{
     879  if (n_IsZero(a, src)) return NULL;
     880  poly result = p_One(dst->extRing);
     881  nMapFunc nMap=n_SetMap(src,dst->extRing->cf);
     882  p_SetCoeff(result, nMap(a, src, dst->extRing->cf), dst->extRing);
     883  if (n_IsZero(pGetCoeff(result),dst->extRing->cf))
     884    p_Delete(&result,dst->extRing);
    898885  return (number)result;
    899886}
     
    10611048  if (h==0)
    10621049  {
    1063     if (nCoeff_is_Q(src) && nCoeff_is_Q(bDst))
    1064       return naMap00;                            /// Q     -->  Q(a)
     1050    if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(bDst))
     1051      return naMap00;                            /// Q or Z     -->  Q(a)
     1052    if ((src->rep==n_rep_gap_gmp) && nCoeff_is_Q(bDst))
     1053      return naMapZ0;                            /// Z     -->  Q(a)
    10651054    if (nCoeff_is_Zp(src) && nCoeff_is_Q(bDst))
    10661055      return naMapP0;                            /// Z/p   -->  Q(a)
    10671056    if (nCoeff_is_Q(src) && nCoeff_is_Zp(bDst))
    10681057      return naMap0P;                            /// Q      --> Z/p(a)
     1058    if ((src->rep==n_rep_gap_gmp) && nCoeff_is_Zp(bDst))
     1059      return naMapZ0;                            /// Z     -->  Z/p(a)
    10691060    if (nCoeff_is_Zp(src) && nCoeff_is_Zp(bDst))
    10701061    {
     
    14231414  cf->is_field=TRUE;
    14241415  cf->is_domain=TRUE;
     1416  cf->rep=n_rep_poly;
    14251417
    14261418  #ifdef LDEBUG
     
    14371429  cf->cfIsMOne       = naIsMOne;
    14381430  cf->cfInit         = naInit;
    1439   cf->cfInit_bigint  = naInit_bigint;
    14401431  cf->cfFarey        = naFarey;
    14411432  cf->cfChineseRemainder= naChineseRemainder;
     
    16171608  cf->cfIsMOne       = naIsMOne;
    16181609  cf->cfInit         = naInit;
    1619   cf->cfInit_bigint  = naInit_bigint;
    16201610  cf->cfFarey        = naFarey;
    16211611  cf->cfChineseRemainder= naChineseRemainder;
  • libpolys/polys/ext_fields/transext.cc

    r653440 r6a1aa7  
    565565}
    566566
    567 number ntInit_bigint(number longratBigIntNumber, const coeffs src, const coeffs cf)
    568 {
    569   assume( cf != NULL );
    570 
    571   const ring A = cf->extRing;
    572 
    573   assume( A != NULL );
    574 
    575   const coeffs C = A->cf;
    576 
    577   assume( C != NULL );
    578 
    579   number n = n_Init_bigint(longratBigIntNumber, src, C);
    580 
    581   if ( n_IsZero(n, C) )
    582   {
    583     n_Delete(&n, C);
    584     return NULL;
    585   }
    586 
    587   fraction result = (fraction)omAlloc0Bin(fractionObjectBin);
    588 
    589   number den = n_GetDenom(n, C);
    590 
    591   assume( n_GreaterZero(den, C) );
    592 
    593   if( n_IsOne(den, C) )
    594   {
    595      NUM(result) = p_NSet(n, A);
    596      //DEN(result) = NULL; // done by ..Alloc0..
    597      n_Delete(&den, C);
    598   }
    599   else
    600   {
    601      DEN(result) = p_NSet(den, A);
    602      NUM(result) = p_NSet(n_GetNumerator(n, C), A);
    603      n_Delete(&n, C);
    604   }
    605 
    606   //COM(result) = 0; // done by ..Alloc0..
    607 
    608   ntTest((number)result);
    609   //check_N((number)result,cf);
    610 
    611   return (number)result;
    612 }
    613 
    614 
    615567number ntInit(long i, const coeffs cf)
    616568{
     
    18041756}
    18051757
    1806 /* assumes that src = Q, dst = Q(t_1, ..., t_s) */
     1758/* assumes that src = Q or Z, dst = Q(t_1, ..., t_s) */
    18071759number ntMap00(number a, const coeffs src, const coeffs dst)
    18081760{
    18091761  if (n_IsZero(a, src)) return NULL;
    18101762  assume(n_Test(a, src));
    1811   assume(src == dst->extRing->cf);
     1763  assume(src->rep == dst->extRing->cf->rep);
    18121764  if ((SR_HDL(a) & SR_INT) || (a->s==3))
    18131765  {
     
    18251777  //check_N((number)ff,dst);
    18261778  return (number)ff;
     1779}
     1780
     1781number ntMapZ0(number a, const coeffs src, const coeffs dst)
     1782{
     1783  if (n_IsZero(a, src)) return NULL;
     1784  assume(n_Test(a, src));
     1785  nMapFunc nMap=n_SetMap(src,dst->extRing->cf);
     1786  poly p=p_NSet(nMap(a, src,dst->extRing->cf), dst->extRing);
     1787  if (n_IsZero(pGetCoeff(p),dst->extRing->cf))
     1788    p_Delete(&p,dst->extRing);
     1789  number res=ntInit(p, dst);
     1790  n_Test(res,dst);
     1791  return res;
    18271792}
    18281793
     
    19921957  if (h==0)
    19931958  {
    1994     if (nCoeff_is_Q(src) && nCoeff_is_Q(bDst))
    1995       return ntMap00;                                 /// Q       -->  Q(T)
     1959    if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(bDst))
     1960      return ntMap00;                                 /// Q or Z   -->  Q(T)
     1961    if (src->rep==n_rep_gap_gmp)
     1962      return ntMapZ0;                                 /// Z   -->  K(T)
    19961963    if (nCoeff_is_Zp(src) && nCoeff_is_Q(bDst))
    19971964      return ntMapP0;                                 /// Z/p     -->  Q(T)
     
    24312398  cf->is_field=TRUE;
    24322399  cf->is_domain=TRUE;
     2400  cf->rep=n_rep_rat_fct;
    24332401
    24342402  cf->factoryVarOffset = R->cf->factoryVarOffset + rVar(R);
     
    24432411  cf->cfIsMOne       = ntIsMOne;
    24442412  cf->cfInit         = ntInit;
    2445   cf->cfInit_bigint  = ntInit_bigint;
    24462413  cf->cfFarey        = ntFarey;
    24472414  cf->cfChineseRemainder = ntChineseRemainder;
Note: See TracChangeset for help on using the changeset viewer.