00001
00002
00003
00004
00005
00006
00007
00008
00010
00011 #ifndef FMPZ_POLY_Q_H
00012 #define FMPZ_POLY_Q_H
00013
00014 #include <stdio.h>
00015 #include <gmp.h>
00016
00017 #include "fmpz.h"
00018 #include "fmpz_poly.h"
00019
00027 #ifndef __GNUC__
00028 #define __asm__ asm
00029 #define __inline__ inline
00030 #endif
00031
00042 typedef struct
00043 {
00044 fmpz_poly_p num;
00045 fmpz_poly_p den;
00046 } fmpz_poly_q_struct;
00047
00055 typedef fmpz_poly_q_struct fmpz_poly_q_t[1];
00056
00061 typedef fmpz_poly_q_struct *fmpz_poly_q_ptr;
00062
00067 typedef gmp_randstate_t fmpz_poly_q_randstate_t;
00068
00073 typedef __gmp_randstate_struct fmpz_poly_q_randstate_struct;
00074
00076
00078
00082 static __inline__
00083 int _fmpz_poly_is_one(const fmpz_poly_p op)
00084 {
00085 return (op->length == 1) && fmpz_is_one(op->coeffs);
00086 }
00087
00091 static __inline__
00092 int _fmpz_poly_is_unit(const fmpz_poly_p op)
00093 {
00094 return (op->length == 1) && (fmpz_is_one(op->coeffs) || fmpz_is_m1(op->coeffs));
00095 }
00096
00098
00100
00102
00103
00111 #define fmpz_poly_q_numref(op) ((op)->num)
00112
00120 #define fmpz_poly_q_denref(op) ((op)->den)
00121
00129 static __inline__
00130 void fmpz_poly_q_get_num(fmpz_poly_p rop, const fmpz_poly_q_ptr op)
00131 {
00132 fmpz_poly_set(rop, op->num);
00133 }
00134
00142 static __inline__
00143 void fmpz_poly_q_get_den(fmpz_poly_p rop, const fmpz_poly_q_ptr op)
00144 {
00145 fmpz_poly_set(rop, op->den);
00146 }
00147
00155 static __inline__
00156 void fmpz_poly_q_set_num(fmpz_poly_q_ptr rop, const fmpz_poly_p op)
00157 {
00158 fmpz_poly_set(rop->num, op);
00159 }
00160
00168 static __inline__
00169 void fmpz_poly_q_set_den(fmpz_poly_q_ptr rop, const fmpz_poly_p op)
00170 {
00171 fmpz_poly_set(rop->den, op);
00172 }
00173
00174 void fmpz_poly_q_canonicalize(fmpz_poly_q_ptr rop);
00175
00177
00178
00188 static __inline__
00189 void fmpz_poly_q_init(fmpz_poly_q_ptr rop)
00190 {
00191 rop->num = (fmpz_poly_p) malloc(sizeof(fmpz_poly_struct));
00192 rop->den = (fmpz_poly_p) malloc(sizeof(fmpz_poly_struct));
00193 fmpz_poly_init(rop->num);
00194 fmpz_poly_init(rop->den);
00195 fmpz_poly_set_coeff_si(rop->den, 0, 1);
00196 }
00197
00206 static __inline__
00207 void fmpz_poly_q_clear(fmpz_poly_q_ptr rop)
00208 {
00209 if (rop->num != NULL)
00210 {
00211 fmpz_poly_clear(rop->num);
00212 free(rop->num);
00213 rop->num = NULL;
00214 }
00215 if (rop->den != NULL);
00216 {
00217 fmpz_poly_clear(rop->den);
00218 free(rop->den);
00219 rop->den = NULL;
00220 }
00221 }
00222
00224
00225
00226 static
00227 void fmpz_poly_q_randinit(fmpz_poly_q_randstate_t state)
00228 {
00229 gmp_randinit_default(state);
00230 gmp_randseed_ui(state, 123456789ul);
00231 }
00232
00233 static
00234 void fmpz_poly_q_randclear(fmpz_poly_q_randstate_t state)
00235 {
00236 gmp_randclear(state);
00237 }
00238
00239 void fmpz_randtest(fmpz_t * f, fmpz_poly_q_randstate_t R, ulong bits);
00240
00241 void fmpz_randtest_not_zero(fmpz_t * f, fmpz_poly_q_randstate_t R, ulong bits);
00242
00243 void fmpz_poly_randtest(fmpz_poly_t poly,
00244 fmpz_poly_q_randstate_t R, ulong len, ulong bits);
00245
00246 void fmpz_poly_randtest_not_zero(fmpz_poly_t poly,
00247 fmpz_poly_q_randstate_t R, ulong len, ulong bits);
00248
00249 void fmpz_poly_q_randtest(fmpz_poly_q_t poly, fmpz_poly_q_randstate_t R,
00250 ulong len1, ulong bits1, ulong len2, ulong bits2);
00251
00252 void
00253 fmpz_poly_q_randtest_not_zero(fmpz_poly_q_t poly, fmpz_poly_q_randstate_t R,
00254 ulong len1, ulong bits1, ulong len2, ulong bits2);
00255
00257
00258
00264 static __inline__
00265 void fmpz_poly_q_set(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op)
00266 {
00267 if (rop != op)
00268 {
00269 fmpz_poly_set(rop->num, op->num);
00270 fmpz_poly_set(rop->den, op->den);
00271 }
00272 }
00273
00279 static __inline__
00280 void fmpz_poly_q_set_si(fmpz_poly_q_ptr rop, long op)
00281 {
00282 fmpz_poly_zero(rop->num);
00283 fmpz_poly_zero(rop->den);
00284 fmpz_poly_set_coeff_si(rop->num, 0, op);
00285 fmpz_poly_set_coeff_si(rop->den, 0, 1);
00286 }
00287
00295 static __inline__
00296 void fmpz_poly_q_swap(fmpz_poly_q_ptr op1, fmpz_poly_q_ptr op2)
00297 {
00298 if (op1 != op2)
00299 {
00300 fmpz_poly_swap(op1->num, op2->num);
00301 fmpz_poly_swap(op1->den, op2->den);
00302 }
00303 }
00304
00310 static __inline__
00311 void fmpz_poly_q_zero(fmpz_poly_q_ptr rop)
00312 {
00313 fmpz_poly_zero(rop->num);
00314 fmpz_poly_zero(rop->den);
00315 fmpz_poly_set_coeff_si(rop->den, 0, 1);
00316 }
00317
00323 static __inline__
00324 void fmpz_poly_q_one(fmpz_poly_q_ptr rop)
00325 {
00326 fmpz_poly_zero(rop->num);
00327 fmpz_poly_zero(rop->den);
00328 fmpz_poly_set_coeff_si(rop->num, 0, 1);
00329 fmpz_poly_set_coeff_si(rop->den, 0, 1);
00330 }
00331
00337 static __inline__
00338 void fmpz_poly_q_neg(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op)
00339 {
00340 fmpz_poly_neg(rop->num, op->num);
00341 fmpz_poly_set(rop->den, op->den);
00342 }
00343
00351 static __inline__
00352 void fmpz_poly_q_inv(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op)
00353 {
00354
00355 if (fmpz_poly_degree(op->num) < 0)
00356 {
00357 printf("ERROR (fmpz_poly_q_canonicalize). Denominator is zero.\n");
00358 abort();
00359 }
00360
00361 if (rop == op)
00362 {
00363 fmpz_poly_swap(rop->num, rop->den);
00364 if (fmpz_sgn(fmpz_poly_lead(rop->den)) < 0)
00365 {
00366 fmpz_poly_neg(rop->num, rop->num);
00367 fmpz_poly_neg(rop->den, rop->den);
00368 }
00369 }
00370 else
00371 {
00372 if (fmpz_sgn(fmpz_poly_lead(op->num)) > 0)
00373 {
00374 fmpz_poly_set(rop->num, op->den);
00375 fmpz_poly_set(rop->den, op->num);
00376 }
00377 else
00378 {
00379 fmpz_poly_neg(rop->num, op->den);
00380 fmpz_poly_neg(rop->den, op->num);
00381 }
00382 }
00383 }
00384
00386
00387
00393 static __inline__
00394 int fmpz_poly_q_is_zero(const fmpz_poly_q_ptr op)
00395 {
00396 return fmpz_poly_degree(op->num) < 0;
00397 }
00398
00405 static __inline__
00406 int fmpz_poly_q_is_one(const fmpz_poly_q_ptr op)
00407 {
00408 return _fmpz_poly_is_one(op->num) && _fmpz_poly_is_one(op->den);
00409 }
00410
00416 static __inline__
00417 int fmpz_poly_q_equal(const fmpz_poly_q_ptr op1, const fmpz_poly_q_ptr op2)
00418 {
00419 return fmpz_poly_equal(op1->num, op2->num) && fmpz_poly_equal(op1->den, op2->den);
00420 }
00421
00423
00424
00425 void fmpz_poly_q_add(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op1, const fmpz_poly_q_ptr op2);
00426 void fmpz_poly_q_sub(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op1, const fmpz_poly_q_ptr op2);
00427
00428 void fmpz_poly_q_addmul(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op1, const fmpz_poly_q_ptr op2);
00429 void fmpz_poly_q_submul(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op1, const fmpz_poly_q_ptr op2);
00430
00432
00433
00434 void fmpz_poly_q_scalar_mul_si(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op, long x);
00435 void fmpz_poly_q_scalar_mul_mpz(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op, const mpz_t x);
00436 void fmpz_poly_q_scalar_mul_mpq(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op, const mpq_t x);
00437
00438 void fmpz_poly_q_scalar_div_si(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op, long x);
00439 void fmpz_poly_q_scalar_div_mpz(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op, const mpz_t x);
00440 void fmpz_poly_q_scalar_div_mpq(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op, const mpq_t x);
00441
00443
00444
00445 void fmpz_poly_q_mul(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op1, const fmpz_poly_q_ptr op2);
00446
00448
00449
00450 void fmpz_poly_q_div(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op1, const fmpz_poly_q_ptr op2);
00451
00453
00454
00455 void fmpz_poly_q_power(fmpz_poly_q_ptr rop, const fmpz_poly_q_ptr op, unsigned long exp);
00456
00458
00459
00460 void fmpz_poly_q_derivative(fmpz_poly_q_ptr rop, fmpz_poly_q_ptr op);
00461
00463
00464
00465 int fmpz_poly_q_evaluate(mpq_t rop, fmpz_poly_q_ptr f, const mpq_t a);
00466
00468
00469
00470 int fmpz_poly_q_from_string(fmpz_poly_q_ptr rop, const char *s);
00471
00472 char * fmpz_poly_q_to_string(const fmpz_poly_q_ptr op);
00473 char * fmpz_poly_q_to_string_pretty(const fmpz_poly_q_ptr op, const char *x);
00474
00475 void fmpz_poly_q_print(const fmpz_poly_q_ptr op);
00476 void fmpz_poly_q_print_pretty(const fmpz_poly_q_ptr op, const char *x);
00477
00478 #endif
00479