1 /* Test mpz_lcm and mpz_lcm_ui. 2 3 Copyright 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 3 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. If not, see http://www.gnu.org/licenses/. */ 19 20 21 #include <stdio.h> 22 #include <stdlib.h> 23 #include <string.h> 24 25 #include "gmp.h" 26 #include "gmp-impl.h" 27 #include "tests.h" 28 29 30 void 31 check_all (mpz_ptr want, mpz_srcptr x_orig, mpz_srcptr y_orig) 32 { 33 mpz_t got, x, y; 34 int negx, negy, swap, inplace; 35 36 mpz_init (got); 37 mpz_init_set (x, x_orig); 38 mpz_init_set (y, y_orig); 39 40 for (swap = 0; swap < 2; swap++) 41 { 42 mpz_swap (x, y); 43 44 for (negx = 0; negx < 2; negx++) 45 { 46 mpz_neg (x, x); 47 48 for (negy = 0; negy < 2; negy++) 49 { 50 mpz_neg (y, y); 51 52 for (inplace = 0; inplace <= 1; inplace++) 53 { 54 if (inplace) 55 { mpz_set (got, x); mpz_lcm (got, got, y); } 56 else 57 mpz_lcm (got, x, y); 58 MPZ_CHECK_FORMAT (got); 59 60 if (mpz_cmp (got, want) != 0) 61 { 62 printf ("mpz_lcm wrong, inplace=%d\n", inplace); 63 fail: 64 mpz_trace ("x", x); 65 mpz_trace ("y", y); 66 mpz_trace ("got", got); 67 mpz_trace ("want", want); 68 abort (); 69 } 70 71 if (mpz_fits_ulong_p (y)) 72 { 73 unsigned long yu = mpz_get_ui (y); 74 if (inplace) 75 { mpz_set (got, x); mpz_lcm_ui (got, got, yu); } 76 else 77 mpz_lcm_ui (got, x, yu); 78 79 if (mpz_cmp (got, want) != 0) 80 { 81 printf ("mpz_lcm_ui wrong, inplace=%d\n", inplace); 82 printf ("yu=%lu\n", yu); 83 goto fail; 84 } 85 } 86 } 87 } 88 } 89 } 90 91 mpz_clear (got); 92 mpz_clear (x); 93 mpz_clear (y); 94 } 95 96 97 void 98 check_primes (void) 99 { 100 static unsigned long prime[] = { 101 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97, 102 101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181, 103 191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277, 104 281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383, 105 389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487, 106 }; 107 mpz_t want, x, y; 108 int i; 109 110 mpz_init (want); 111 mpz_init (x); 112 mpz_init (y); 113 114 /* New prime each time. */ 115 mpz_set_ui (want, 1L); 116 for (i = 0; i < numberof (prime); i++) 117 { 118 mpz_set (x, want); 119 mpz_set_ui (y, prime[i]); 120 mpz_mul_ui (want, want, prime[i]); 121 check_all (want, x, y); 122 } 123 124 /* Old prime each time. */ 125 mpz_set (x, want); 126 for (i = 0; i < numberof (prime); i++) 127 { 128 mpz_set_ui (y, prime[i]); 129 check_all (want, x, y); 130 } 131 132 /* One old, one new each time. */ 133 mpz_set_ui (want, prime[0]); 134 for (i = 1; i < numberof (prime); i++) 135 { 136 mpz_set (x, want); 137 mpz_set_ui (y, prime[i] * prime[i-1]); 138 mpz_mul_ui (want, want, prime[i]); 139 check_all (want, x, y); 140 } 141 142 /* Triplets with A,B in x and B,C in y. */ 143 mpz_set_ui (want, 1L); 144 mpz_set_ui (x, 1L); 145 mpz_set_ui (y, 1L); 146 for (i = 0; i+2 < numberof (prime); i += 3) 147 { 148 mpz_mul_ui (want, want, prime[i]); 149 mpz_mul_ui (want, want, prime[i+1]); 150 mpz_mul_ui (want, want, prime[i+2]); 151 152 mpz_mul_ui (x, x, prime[i]); 153 mpz_mul_ui (x, x, prime[i+1]); 154 155 mpz_mul_ui (y, y, prime[i+1]); 156 mpz_mul_ui (y, y, prime[i+2]); 157 158 check_all (want, x, y); 159 } 160 161 162 mpz_clear (want); 163 mpz_clear (x); 164 mpz_clear (y); 165 } 166 167 168 169 int 170 main (int argc, char *argv[]) 171 { 172 tests_start (); 173 174 check_primes (); 175 176 tests_end (); 177 exit (0); 178 } 179