[BACK]Return to refmpz.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / tests

Annotation of OpenXM_contrib/gmp/tests/refmpz.c, Revision 1.1

1.1     ! ohara       1: /* Reference mpz functions.
        !             2:
        !             3: Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
        !             4:
        !             5: This file is part of the GNU MP Library.
        !             6:
        !             7: The GNU MP Library is free software; you can redistribute it and/or modify
        !             8: it under the terms of the GNU Lesser General Public License as published by
        !             9: the Free Software Foundation; either version 2.1 of the License, or (at your
        !            10: option) any later version.
        !            11:
        !            12: The GNU MP Library is distributed in the hope that it will be useful, but
        !            13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14: or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
        !            15: License for more details.
        !            16:
        !            17: You should have received a copy of the GNU Lesser General Public License
        !            18: along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
        !            19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
        !            20: MA 02111-1307, USA. */
        !            21:
        !            22: /* always do assertion checking */
        !            23: #define WANT_ASSERT  1
        !            24:
        !            25: #include <stdio.h>
        !            26: #include <stdlib.h> /* for free */
        !            27: #include "gmp.h"
        !            28: #include "gmp-impl.h"
        !            29: #include "longlong.h"
        !            30: #include "tests.h"
        !            31:
        !            32:
        !            33: /* Change this to "#define TRACE(x) x" for some traces. */
        !            34: #define TRACE(x)
        !            35:
        !            36:
        !            37: unsigned long
        !            38: refmpz_hamdist (mpz_srcptr x, mpz_srcptr y)
        !            39: {
        !            40:   mp_size_t      tsize;
        !            41:   mp_ptr         xp, yp;
        !            42:   unsigned long  ret;
        !            43:
        !            44:   if ((SIZ(x) < 0 && SIZ(y) >= 0)
        !            45:       || (SIZ(y) < 0 && SIZ(x) >= 0))
        !            46:     return ULONG_MAX;
        !            47:
        !            48:   tsize = MAX (ABSIZ(x), ABSIZ(y));
        !            49:
        !            50:   xp = refmpn_malloc_limbs (tsize);
        !            51:   refmpn_zero (xp, tsize);
        !            52:   refmpn_copy (xp, PTR(x), ABSIZ(x));
        !            53:
        !            54:   yp = refmpn_malloc_limbs (tsize);
        !            55:   refmpn_zero (yp, tsize);
        !            56:   refmpn_copy (yp, PTR(y), ABSIZ(y));
        !            57:
        !            58:   if (SIZ(x) < 0)
        !            59:     refmpn_neg_n (xp, xp, tsize);
        !            60:
        !            61:   if (SIZ(x) < 0)
        !            62:     refmpn_neg_n (yp, yp, tsize);
        !            63:
        !            64:   ret = refmpn_hamdist (xp, yp, tsize);
        !            65:
        !            66:   free (xp);
        !            67:   free (yp);
        !            68:   return ret;
        !            69: }
        !            70:
        !            71:
        !            72: /* (0/b), with mpz b; is 1 if b=+/-1, 0 otherwise */
        !            73: #define JACOBI_0Z(b)  JACOBI_0LS (PTR(b)[0], SIZ(b))
        !            74:
        !            75: /* (a/b) effect due to sign of b: mpz/mpz */
        !            76: #define JACOBI_BSGN_ZZ_BIT1(a, b)   JACOBI_BSGN_SS_BIT1 (SIZ(a), SIZ(b))
        !            77:
        !            78: /* (a/b) effect due to sign of a: mpz/unsigned-mpz, b odd;
        !            79:    is (-1/b) if a<0, or +1 if a>=0 */
        !            80: #define JACOBI_ASGN_ZZU_BIT1(a, b)  JACOBI_ASGN_SU_BIT1 (SIZ(a), PTR(b)[0])
        !            81:
        !            82: int
        !            83: refmpz_kronecker (mpz_srcptr a_orig, mpz_srcptr b_orig)
        !            84: {
        !            85:   unsigned long  twos;
        !            86:   mpz_t  a, b;
        !            87:   int    result_bit1 = 0;
        !            88:
        !            89:   if (mpz_sgn (b_orig) == 0)
        !            90:     return JACOBI_Z0 (a_orig);  /* (a/0) */
        !            91:
        !            92:   if (mpz_sgn (a_orig) == 0)
        !            93:     return JACOBI_0Z (b_orig);  /* (0/b) */
        !            94:
        !            95:   if (mpz_even_p (a_orig) && mpz_even_p (b_orig))
        !            96:     return 0;
        !            97:
        !            98:   if (mpz_cmp_ui (b_orig, 1) == 0)
        !            99:     return 1;
        !           100:
        !           101:   mpz_init_set (a, a_orig);
        !           102:   mpz_init_set (b, b_orig);
        !           103:
        !           104:   if (mpz_sgn (b) < 0)
        !           105:     {
        !           106:       result_bit1 ^= JACOBI_BSGN_ZZ_BIT1 (a, b);
        !           107:       mpz_neg (b, b);
        !           108:     }
        !           109:   if (mpz_even_p (b))
        !           110:     {
        !           111:       twos = mpz_scan1 (b, 0L);
        !           112:       mpz_tdiv_q_2exp (b, b, twos);
        !           113:       result_bit1 ^= JACOBI_TWOS_U_BIT1 (twos, PTR(a)[0]);
        !           114:     }
        !           115:
        !           116:   if (mpz_sgn (a) < 0)
        !           117:     {
        !           118:       result_bit1 ^= JACOBI_N1B_BIT1 (PTR(b)[0]);
        !           119:       mpz_neg (a, a);
        !           120:     }
        !           121:   if (mpz_even_p (a))
        !           122:     {
        !           123:       twos = mpz_scan1 (a, 0L);
        !           124:       mpz_tdiv_q_2exp (a, a, twos);
        !           125:       result_bit1 ^= JACOBI_TWOS_U_BIT1 (twos, PTR(b)[0]);
        !           126:     }
        !           127:
        !           128:   for (;;)
        !           129:     {
        !           130:       ASSERT (mpz_odd_p (a));
        !           131:       ASSERT (mpz_odd_p (b));
        !           132:       ASSERT (mpz_sgn (a) > 0);
        !           133:       ASSERT (mpz_sgn (b) > 0);
        !           134:
        !           135:       TRACE (printf ("top\n");
        !           136:              mpz_trace (" a", a);
        !           137:              mpz_trace (" b", b));
        !           138:
        !           139:       if (mpz_cmp (a, b) < 0)
        !           140:         {
        !           141:           TRACE (printf ("swap\n"));
        !           142:           mpz_swap (a, b);
        !           143:           result_bit1 ^= JACOBI_RECIP_UU_BIT1 (PTR(a)[0], PTR(b)[0]);
        !           144:         }
        !           145:
        !           146:       if (mpz_cmp_ui (b, 1) == 0)
        !           147:         break;
        !           148:
        !           149:       mpz_sub (a, a, b);
        !           150:       TRACE (printf ("sub\n");
        !           151:              mpz_trace (" a", a));
        !           152:       if (mpz_sgn (a) == 0)
        !           153:         goto zero;
        !           154:
        !           155:       twos = mpz_scan1 (a, 0L);
        !           156:       mpz_fdiv_q_2exp (a, a, twos);
        !           157:       TRACE (printf ("twos %lu\n", twos);
        !           158:              mpz_trace (" a", a));
        !           159:       result_bit1 ^= JACOBI_TWOS_U_BIT1 (twos, PTR(b)[0]);
        !           160:     }
        !           161:
        !           162:   mpz_clear (a);
        !           163:   mpz_clear (b);
        !           164:   return JACOBI_BIT1_TO_PN (result_bit1);
        !           165:
        !           166:  zero:
        !           167:   mpz_clear (a);
        !           168:   mpz_clear (b);
        !           169:   return 0;
        !           170: }
        !           171:
        !           172: /* Same as mpz_kronecker, but ignoring factors of 2 on b */
        !           173: int
        !           174: refmpz_jacobi (mpz_srcptr a, mpz_srcptr b)
        !           175: {
        !           176:   mpz_t  b_odd;
        !           177:   mpz_init_set (b_odd, b);
        !           178:   if (mpz_sgn (b_odd) != 0)
        !           179:     mpz_fdiv_q_2exp (b_odd, b_odd, mpz_scan1 (b_odd, 0L));
        !           180:   return refmpz_kronecker (a, b_odd);
        !           181: }
        !           182:
        !           183: int
        !           184: refmpz_legendre (mpz_srcptr a, mpz_srcptr b)
        !           185: {
        !           186:   return refmpz_jacobi (a, b);
        !           187: }
        !           188:
        !           189:
        !           190: int
        !           191: refmpz_kronecker_ui (mpz_srcptr a, unsigned long b)
        !           192: {
        !           193:   mpz_t  bz;
        !           194:   int    ret;
        !           195:   mpz_init_set_ui (bz, b);
        !           196:   ret = refmpz_kronecker (a, bz);
        !           197:   mpz_clear (bz);
        !           198:   return ret;
        !           199: }
        !           200:
        !           201: int
        !           202: refmpz_kronecker_si (mpz_srcptr a, long b)
        !           203: {
        !           204:   mpz_t  bz;
        !           205:   int    ret;
        !           206:   mpz_init_set_si (bz, b);
        !           207:   ret = refmpz_kronecker (a, bz);
        !           208:   mpz_clear (bz);
        !           209:   return ret;
        !           210: }
        !           211:
        !           212: int
        !           213: refmpz_ui_kronecker (unsigned long a, mpz_srcptr b)
        !           214: {
        !           215:   mpz_t  az;
        !           216:   int    ret;
        !           217:   mpz_init_set_ui (az, a);
        !           218:   ret = refmpz_kronecker (az, b);
        !           219:   mpz_clear (az);
        !           220:   return ret;
        !           221: }
        !           222:
        !           223: int
        !           224: refmpz_si_kronecker (long a, mpz_srcptr b)
        !           225: {
        !           226:   mpz_t  az;
        !           227:   int    ret;
        !           228:   mpz_init_set_si (az, a);
        !           229:   ret = refmpz_kronecker (az, b);
        !           230:   mpz_clear (az);
        !           231:   return ret;
        !           232: }
        !           233:
        !           234:
        !           235: void
        !           236: refmpz_pow_ui (mpz_ptr w, mpz_srcptr b, unsigned long e)
        !           237: {
        !           238:   mpz_t          s, t;
        !           239:   unsigned long  i;
        !           240:
        !           241:   mpz_init_set_ui (t, 1L);
        !           242:   mpz_init_set (s, b);
        !           243:
        !           244:   if ((e & 1) != 0)
        !           245:     mpz_mul (t, t, s);
        !           246:
        !           247:   for (i = 2; i <= e; i <<= 1)
        !           248:     {
        !           249:       mpz_mul (s, s, s);
        !           250:       if ((i & e) != 0)
        !           251:        mpz_mul (t, t, s);
        !           252:     }
        !           253:
        !           254:   mpz_set (w, t);
        !           255:
        !           256:   mpz_clear (s);
        !           257:   mpz_clear (t);
        !           258: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>