00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <stdio.h>
00016 #include <stdlib.h>
00017 #include <polylib/polylib.h>
00018
00019 #ifdef MAC_OS
00020 #define abs __abs
00021 #endif
00022
00023
00024
00025
00026 void Factorial(int n, Value *fact) {
00027
00028 int i;
00029 Value tmp;
00030
00031 value_init(tmp);
00032
00033 value_set_si(*fact,1);
00034 for (i=1;i<=n;i++) {
00035 value_set_si(tmp,i);
00036 value_multiply(*fact,*fact,tmp);
00037 }
00038 value_clear(tmp);
00039 }
00040
00041
00042
00043
00044 void Binomial(int n, int p, Value *result) {
00045
00046 int i;
00047 Value tmp;
00048 Value f;
00049
00050 value_init(tmp);value_init(f);
00051
00052 if (n-p<p)
00053 p=n-p;
00054 if (p!=0) {
00055 value_set_si(*result,(n-p+1));
00056 for (i=n-p+2;i<=n;i++) {
00057 value_set_si(tmp,i);
00058 value_multiply(*result,*result,tmp);
00059 }
00060 Factorial(p,&f);
00061 value_division(*result,*result,f);
00062 }
00063 else
00064 value_set_si(*result,1);
00065 value_clear(f);value_clear(tmp);
00066 }
00067
00068
00069
00070
00071
00072 void CNP(int a,int b, Value *result) {
00073
00074 int i;
00075 Value tmp;
00076 value_init(tmp);
00077
00078 value_set_si(*result,1);
00079
00080
00081 if(a <= b) {
00082 value_clear(tmp);
00083 return;
00084 }
00085 for(i=a;i>b;--i) {
00086 value_set_si(tmp,i);
00087 value_multiply(*result,*result,tmp);
00088 }
00089 for(i=1;i<=(a-b);++i) {
00090 value_set_si(tmp,i);
00091 value_division(*result,*result,tmp);
00092 }
00093 value_clear(tmp);
00094 }
00095
00096
00097
00098
00099 void Gcd(Value a,Value b,Value *result) {
00100
00101 Value acopy, bcopy;
00102
00103 value_init(acopy);
00104 value_init(bcopy);
00105 value_assign(acopy,a);
00106 value_assign(bcopy,b);
00107 while(value_notzero_p(acopy)) {
00108 value_modulus(*result,bcopy,acopy);
00109 value_assign(bcopy,acopy);
00110 value_assign(acopy,*result);
00111 }
00112 value_absolute(*result,bcopy);
00113 value_clear(acopy);
00114 value_clear(bcopy);
00115 }
00116
00117
00118
00119
00120 int First_Non_Zero(Value *p,unsigned length) {
00121
00122 Value *cp;
00123 int i;
00124
00125 cp = p;
00126 for (i=0;i<length;i++) {
00127 if (value_notzero_p(*cp))
00128 break;
00129 cp++;
00130 }
00131 return((i==length) ? -1 : i );
00132 }
00133
00134
00135
00136
00137 Vector *Vector_Alloc(unsigned length) {
00138
00139 int i;
00140 Vector *vector;
00141
00142 vector = (Vector *)malloc(sizeof(Vector));
00143 if (!vector) {
00144 errormsg1("Vector_Alloc", "outofmem", "out of memory space");
00145 return 0;
00146 }
00147 vector->Size=length;
00148 vector->p=(Value *)malloc(length * sizeof(Value));
00149 if (!vector->p) {
00150 errormsg1("Vector_Alloc", "outofmem", "out of memory space");
00151 free(vector);
00152 return 0;
00153 }
00154 for(i=0;i<length;i++)
00155 value_init(vector->p[i]);
00156 return vector;
00157 }
00158
00159
00160
00161
00162 void Vector_Free(Vector *vector) {
00163
00164 int i;
00165
00166 if (!vector) return;
00167 for(i=0;i<vector->Size;i++)
00168 value_clear(vector->p[i]);
00169 free(vector->p);
00170 free(vector);
00171 }
00172
00173
00174
00175
00176 void Vector_Print(FILE *Dst, const char *Format, Vector *vector)
00177 {
00178 int i;
00179 Value *p;
00180 unsigned length;
00181
00182 fprintf(Dst, "%d\n", length=vector->Size);
00183 p = vector->p;
00184 for (i=0;i<length;i++) {
00185 if (Format) {
00186 value_print(Dst,Format,*p++);
00187 }
00188 else {
00189 value_print(Dst,P_VALUE_FMT,*p++);
00190 }
00191 }
00192 fprintf(Dst, "\n");
00193 }
00194
00195
00196
00197
00198 Vector *Vector_Read() {
00199
00200 Vector *vector;
00201 unsigned length;
00202 int i;
00203 char str[1024];
00204 Value *p;
00205
00206 scanf("%d", &length);
00207 vector = Vector_Alloc(length);
00208 if (!vector) {
00209 errormsg1("Vector_Read", "outofmem", "out of memory space");
00210 return 0;
00211 }
00212 p = vector->p;
00213 for (i=0;i<length;i++) {
00214 scanf("%s",str);
00215 value_read(*(p++),str);
00216 }
00217 return vector;
00218 }
00219
00220
00221
00222
00223 void Vector_Set(Value *p,int n,unsigned length) {
00224
00225 Value *cp;
00226 int i;
00227
00228 cp = p;
00229 for (i=0;i<length;i++) {
00230 value_set_si(*cp,n);
00231 cp++;
00232 }
00233 return;
00234 }
00235
00236
00237
00238
00239 void Vector_Exchange(Value *p1, Value *p2, unsigned length) {
00240
00241 int i;
00242
00243 for(i=0;i<length;i++) {
00244 value_swap(p1[i],p2[i]);
00245 }
00246 return;
00247 }
00248
00249
00250
00251
00252 void Vector_Copy(Value *p1,Value *p2,unsigned length) {
00253
00254 int i;
00255 Value *cp1, *cp2;
00256
00257 cp1 = p1;
00258 cp2 = p2;
00259
00260 for(i=0;i<length;i++)
00261 value_assign(*cp2++,*cp1++);
00262
00263 return;
00264 }
00265
00266
00267
00268
00269 void Vector_Add(Value *p1,Value *p2,Value *p3,unsigned length) {
00270
00271 Value *cp1, *cp2, *cp3;
00272 int i;
00273
00274 cp1=p1;
00275 cp2=p2;
00276 cp3=p3;
00277 for (i=0;i<length;i++) {
00278
00279
00280 value_addto(*cp3,*cp1,*cp2);
00281 cp1++; cp2++; cp3++;
00282 }
00283 }
00284
00285
00286
00287
00288 void Vector_Sub(Value *p1,Value *p2,Value *p3,unsigned length) {
00289
00290 Value *cp1, *cp2, *cp3;
00291 int i;
00292
00293 cp1=p1;
00294 cp2=p2;
00295 cp3=p3;
00296 for (i=0;i<length;i++) {
00297
00298
00299 value_subtract(*cp3,*cp1,*cp2);
00300 cp1++; cp2++; cp3++;
00301 }
00302 }
00303
00304
00305
00306
00307 void Vector_Or(Value *p1,Value *p2,Value *p3,unsigned length) {
00308
00309 Value *cp1, *cp2, *cp3;
00310 int i;
00311
00312 cp1=p1;
00313 cp2=p2;
00314 cp3=p3;
00315 for (i=0;i<length;i++) {
00316
00317
00318 value_orto(*cp3,*cp1,*cp2);
00319 cp1++; cp2++; cp3++;
00320 }
00321 }
00322
00323
00324
00325
00326 void Vector_Scale(Value *p1,Value *p2,Value lambda,unsigned length) {
00327
00328 Value *cp1, *cp2;
00329 int i;
00330
00331 cp1=p1;
00332 cp2=p2;
00333 for (i=0;i<length;i++) {
00334
00335
00336 value_multiply(*cp2,*cp1,lambda);
00337 cp1++; cp2++;
00338 }
00339 }
00340
00341
00342
00343
00344
00345 void Vector_AntiScale(Value *p1, Value *p2, Value lambda, unsigned length)
00346 {
00347 int i;
00348
00349 for (i = 0; i < length; i++)
00350 value_divexact(p2[i], p1[i], lambda);
00351 }
00352
00353
00354
00355
00356 void Vector_Oppose(Value *p1, Value *p2, unsigned len)
00357 {
00358 unsigned i;
00359
00360 for (i = 0; i < len; ++i)
00361 value_oppose(p2[i], p1[i]);
00362 }
00363
00364
00365
00366
00367 void Inner_Product(Value *p1, Value *p2, unsigned length, Value *ip)
00368 {
00369 int i;
00370
00371 if (length != 0)
00372 value_multiply(*ip, p1[0], p2[0]);
00373 else
00374 value_set_si(*ip, 0);
00375 for(i = 1; i < length; i++)
00376 value_addmul(*ip, p1[i], p2[i]);
00377 }
00378
00379
00380
00381
00382 void Vector_Max(Value *p,unsigned length, Value *max) {
00383
00384 Value *cp;
00385 int i;
00386
00387 cp=p;
00388 value_assign(*max,*cp);
00389 cp++;
00390 for (i=1;i<length;i++) {
00391 value_maximum(*max,*max,*cp);
00392 cp++;
00393 }
00394 }
00395
00396
00397
00398
00399 void Vector_Min(Value *p,unsigned length,Value *min) {
00400
00401 Value *cp;
00402 int i;
00403
00404 cp=p;
00405 value_assign(*min,*cp);
00406 cp++;
00407 for (i=1;i<length;i++) {
00408 value_minimum(*min,*min,*cp);
00409 cp++;
00410 }
00411 return;
00412 }
00413
00414
00415
00416
00417 void Vector_Combine(Value *p1, Value *p2, Value *p3, Value lambda, Value mu,
00418 unsigned length)
00419 {
00420 Value tmp;
00421 int i;
00422
00423 value_init(tmp);
00424 for (i = 0; i < length; i++) {
00425 value_multiply(tmp, lambda, p1[i]);
00426 value_addmul(tmp, mu, p2[i]);
00427 value_assign(p3[i], tmp);
00428 }
00429 value_clear(tmp);
00430 return;
00431 }
00432
00433
00434
00435
00436 int Vector_Equal(Value *Vec1, Value *Vec2, unsigned n)
00437 {
00438 int i;
00439
00440 for (i = 0; i < n; ++i)
00441 if (value_ne(Vec1[i], Vec2[i]))
00442 return 0;
00443
00444 return 1;
00445 }
00446
00447
00448
00449
00450
00451
00452 void Vector_Min_Not_Zero(Value *p,unsigned length,int *index,Value *min)
00453 {
00454 Value aux;
00455 int i;
00456
00457
00458 i = First_Non_Zero(p, length);
00459 if (i == -1) {
00460 value_set_si(*min,1);
00461 return;
00462 }
00463 *index = i;
00464 value_absolute(*min, p[i]);
00465 value_init(aux);
00466 for (i = i+1; i < length; i++) {
00467 if (value_zero_p(p[i]))
00468 continue;
00469 value_absolute(aux, p[i]);
00470 if (value_lt(aux,*min)) {
00471 value_assign(*min,aux);
00472 *index = i;
00473 }
00474 }
00475 value_clear(aux);
00476 }
00477
00478
00479
00480
00481 void Vector_Gcd(Value *p,unsigned length,Value *min) {
00482
00483 Value *q,*cq, *cp;
00484 int i, Not_Zero, Index_Min=0;
00485
00486 q = (Value *)malloc(length*sizeof(Value));
00487
00488
00489 for(i=0;i<length;i++)
00490 value_init(q[i]);
00491
00492
00493
00494 cp=p;
00495 for (cq = q,i=0;i<length;i++) {
00496 value_absolute(*cq,*cp);
00497 cq++;
00498 cp++;
00499 }
00500 do {
00501 Vector_Min_Not_Zero(q,length,&Index_Min,min);
00502
00503
00504 if (value_notone_p(*min)) {
00505
00506 cq=q;
00507 Not_Zero=0;
00508 for (i=0;i<length;i++,cq++)
00509 if (i!=Index_Min) {
00510
00511
00512 value_modulus(*cq,*cq,*min);
00513 Not_Zero |= value_notzero_p(*cq);
00514 }
00515 }
00516 else
00517 break;
00518 } while (Not_Zero);
00519
00520
00521 for(i=0;i<length;i++)
00522 value_clear(q[i]);
00523 free(q);
00524 }
00525
00526
00527
00528
00529
00530 void Vector_Map(Value *p1,Value *p2,Value *p3,unsigned length,
00531 Value *(*f)(Value,Value))
00532 {
00533 Value *cp1, *cp2, *cp3;
00534 int i;
00535
00536 cp1=p1;
00537 cp2=p2;
00538 cp3=p3;
00539 for(i=0;i<length;i++) {
00540 value_assign(*cp3,*(*f)(*cp1, *cp2));
00541 cp1++; cp2++; cp3++;
00542 }
00543 return;
00544 }
00545
00546
00547
00548
00549
00550
00551 void Vector_Normalize(Value *p,unsigned length) {
00552
00553 Value gcd;
00554 int i;
00555
00556 value_init(gcd);
00557
00558 Vector_Gcd(p,length,&gcd);
00559
00560 if (value_notone_p(gcd))
00561 Vector_AntiScale(p, p, gcd, length);
00562
00563 value_clear(gcd);
00564 }
00565
00566
00567
00568
00569
00570 void Vector_Normalize_Positive(Value *p,int length,int pos) {
00571
00572 Value gcd;
00573 int i;
00574
00575 value_init(gcd);
00576 Vector_Gcd(p,length,&gcd);
00577 if (value_neg_p(p[pos]))
00578 value_oppose(gcd,gcd);
00579 if(value_notone_p(gcd))
00580 Vector_AntiScale(p, p, gcd, length);
00581 value_clear(gcd);
00582 }
00583
00584
00585
00586
00587 void Vector_Reduce(Value *p,unsigned length,void(*f)(Value,Value *),Value *r) {
00588
00589 Value *cp;
00590 int i;
00591
00592 cp = p;
00593 value_assign(*r,*cp);
00594 for(i=1;i<length;i++) {
00595 cp++;
00596 (*f)(*cp,r);
00597 }
00598 }
00599
00600
00601
00602
00603 void Vector_Sort(Value *vector,unsigned n) {
00604
00605 int i, j;
00606 Value temp;
00607 Value *current_node=(Value *)0;
00608 Value *left_son,*right_son;
00609
00610 value_init(temp);
00611
00612 for (i=(n-1)/2;i>=0;i--) {
00613
00614
00615 j=i;
00616 value_assign(temp,*(vector+i));
00617
00618
00619 while (j<=(n-1)/2) {
00620 current_node = vector+j;
00621 left_son = vector+(j<<1)+1;
00622
00623
00624 if ((j<<1)+2>=n) {
00625 if (value_lt(temp,*left_son)) {
00626 value_assign(*current_node,*left_son);
00627 j=(j<<1)+1;
00628 }
00629 else
00630 break;
00631 }
00632 else {
00633
00634
00635 right_son=left_son+1;
00636 if (value_lt(*right_son,*left_son)) {
00637 if (value_lt(temp,*left_son)) {
00638 value_assign(*current_node,*left_son);
00639 j=(j<<1)+1;
00640 }
00641 else
00642 break;
00643 }
00644 else {
00645 if (value_lt(temp,*right_son)) {
00646 value_assign(*current_node,*right_son );
00647 j=(j<<1)+2;
00648 }
00649 else
00650 break;
00651 }
00652 }
00653 }
00654 value_assign(*current_node,temp);
00655 }
00656 for(i=n-1;i>0;i--) {
00657
00658
00659 value_assign(temp, *(vector+i));
00660 value_assign(*(vector+i),*vector);
00661 j=0;
00662
00663
00664 while (j<i/2) {
00665 current_node=vector+j;
00666 left_son=vector+(j<<1)+1;
00667
00668
00669 if ((j<<1)+2>=i) {
00670 if (value_lt(temp,*left_son)) {
00671 value_assign(*current_node,*left_son);
00672 j=(j<<1)+1;
00673 }
00674 else
00675 break;
00676 }
00677 else {
00678
00679
00680 right_son=left_son+1;
00681 if (value_lt(*right_son,*left_son)) {
00682 if (value_lt(temp,*left_son)) {
00683 value_assign(*current_node,*left_son);
00684 j=(j<<1)+1;
00685 }
00686 else
00687 break;
00688 }
00689 else {
00690 if (value_lt(temp,*right_son)) {
00691 value_assign(*current_node,*right_son );
00692 j=(j<<1)+2;
00693 }
00694 else
00695 break;
00696 }
00697 }
00698 }
00699 value_assign(*current_node,temp);
00700 }
00701 value_clear(temp);
00702 return;
00703 }
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713 int ConstraintSimplify(Value *old, Value *newp, int len, Value* v)
00714 {
00715
00716 Vector_Gcd(old+1, len - 1, v);
00717 if (value_notone_p(*v))
00718 Vector_AntiScale(old+1, newp+1, *v, len-1);
00719
00720 Vector_Gcd(old+1, len - 2, v);
00721
00722 if (value_one_p(*v))
00723 return 0;
00724
00725 Vector_AntiScale(old+1, newp+1, *v, len-2);
00726 value_pdivision(newp[len-1], old[len-1], *v);
00727 return 1;
00728 }
00729
00730 int Vector_IsZero(Value * v, unsigned length) {
00731 unsigned i;
00732 if (value_notzero_p(v[0])) return 0;
00733 else {
00734 value_set_si(v[0], 1);
00735 for (i=length-1; value_zero_p(v[i]); i--);
00736 value_set_si(v[0], 0);
00737 return (i==0);
00738 }
00739 }
00740
00741 #define MAX_CACHE_SIZE 20
00742 static struct {
00743 Value *p;
00744 int size;
00745 } cache[MAX_CACHE_SIZE];
00746 static int cache_size = 0;
00747
00748 Value* value_alloc(int want, int *got)
00749 {
00750 int i;
00751 Value *p;
00752
00753 if (cache_size) {
00754 int best;
00755 for (i = 0; i < cache_size; ++i) {
00756 if (cache[i].size >= want) {
00757 Value *p = cache[i].p;
00758 *got = cache[i].size;
00759 if (--cache_size != i)
00760 cache[i] = cache[cache_size];
00761 Vector_Set(p, 0, want);
00762 return p;
00763 }
00764 if (i == 0)
00765 best = 0;
00766 else if (cache[i].size > cache[best].size)
00767 best = i;
00768 }
00769
00770 p = (Value *)realloc(cache[best].p, want * sizeof(Value));
00771 *got = cache[best].size;
00772 if (--cache_size != best)
00773 cache[best] = cache[cache_size];
00774 Vector_Set(p, 0, *got);
00775 } else {
00776 p = (Value *)malloc(want * sizeof(Value));
00777 *got = 0;
00778 }
00779
00780 if (!p)
00781 return p;
00782
00783 for (i = *got; i < want; ++i)
00784 value_init(p[i]);
00785 *got = want;
00786
00787 return p;
00788 }
00789
00790 void value_free(Value *p, int size)
00791 {
00792 int i;
00793
00794 if (cache_size < MAX_CACHE_SIZE) {
00795 cache[cache_size].p = p;
00796 cache[cache_size].size = size;
00797 ++cache_size;
00798 return;
00799 }
00800
00801 for (i=0; i < size; i++)
00802 value_clear(p[i]);
00803 free(p);
00804 }
00805