/* This (GMP) C source file was automatically generated by CS version 1.4, with cs::HOLONOMIC = FALSE and cs::LAZY = FALSE, from the following specification: {T = Prod(Z, Sequence(T))}, in the standard form: {T4 = ProdPrdSeq(T, T3), T = Prod(Z, T1), T5 = ProdSeq(T, T3), T1 = Union(T2, T5), Z = Atom(Z), T3 = Union(T2, T4), T2 = Epsilon(T2)}. You can get CS from http://dept-info.labri.u-bordeaux.fr/~dutour/CS. Please report any bug, improvement to the authors of CS: cs@labri.u-bordeaux.fr Sylvie Corteel - LRI Alain Denise - LRI Isabelle Dutour - LaBRI Paul Zimmermann - INRIA */ #include #include #include #include "gmp.h" extern double drand48(); int NOINIT(mpz_t p) { return(mpz_cmp_si(p,-1)); } int INIT(mpz_t p) { return(mpz_cmp_si(p,0)); } #ifndef WORDS #define PROD_OPEN printf("Prod(") #define PROD_SEP printf(",") #define PROD_CLOSE printf(")") #define EPSILON printf("Epsilon") #else #define PROD_OPEN {} #define PROD_SEP {} #define PROD_CLOSE {} #define EPSILON {} #endif mpz_t s,tmp; mpz_t *T4; void countT4(); void drawT4(); mpz_t *T; void countT(); void drawT(); mpz_t *T5; void countT5(); void drawT5(); mpz_t *T1; void countT1(); void drawT1(); mpz_t *Z; void countZ(); void drawZ(); mpz_t *T3; void countT3(); void drawT3(); mpz_t *T2; void countT2(); void drawT2(); main(int argc,char *argv[]) { int i,n,k; if (argc<=1) { printf("Usage: a.out n [k seed] to generate k objects of size n\n"); exit(1);} n=atoi(argv[1]); k=(argc>=3) ? atoi(argv[2]) : 1; srand48((argc>=4) ? atoi(argv[3]) : getpid()); mpz_init(tmp); mpz_init(s); T4=(mpz_t *)malloc((n+1)*sizeof(mpz_t)); for (i=0;i<1 && i<=n;i++) mpz_init_set_si(T4[i],0); for (;i<=n;i++) mpz_init_set_si(T4[i],-1); T=(mpz_t *)malloc((n+1)*sizeof(mpz_t)); for (i=0;i<1 && i<=n;i++) mpz_init_set_si(T[i],0); for (;i<=n;i++) mpz_init_set_si(T[i],-1); T1=(mpz_t *)malloc((n+1)*sizeof(mpz_t)); for (i=0;i<0 && i<=n;i++) mpz_init_set_si(T1[i],0); for (;i<=n;i++) mpz_init_set_si(T1[i],-1); Z=(mpz_t *)malloc((n+1)*sizeof(mpz_t)); for (i=0;i<1 && i<=n;i++) mpz_init_set_si(Z[i],0); for (;i<=n;i++) mpz_init_set_si(Z[i],-1); T3=(mpz_t *)malloc((n+1)*sizeof(mpz_t)); for (i=0;i<0 && i<=n;i++) mpz_init_set_si(T3[i],0); for (;i<=n;i++) mpz_init_set_si(T3[i],-1); T2=(mpz_t *)malloc((n+1)*sizeof(mpz_t)); for (i=0;i<0 && i<=n;i++) mpz_init_set_si(T2[i],0); for (;i<=n;i++) mpz_init_set_si(T2[i],-1); T5=T4; countT(n); if (mpz_cmp_ui(T[n],0)<=0) {printf("there is no such structure of this size\n"); exit(1);} if (k==0) {mpz_out_str (stdout, 10, T[n]); puts("");} for (i=1;i<=k;i++) { drawT(n); putchar('\n'); } mpz_clear(tmp); mpz_clear(s); } /* T4 = ProdPrdSeq(T, T3) */ void countT4(int n) { int k; if (NOINIT(T4[n])==0) { countT(1); countT3(n-1); mpz_mul(T4[n],T[1],T3[n-1]); for (k=2;k<=n;k++) { countT(k); countT3(n-k); mpz_mul(tmp,T[k],T3[n-k]); mpz_add(T4[n],T4[n],tmp); } } } /* T = Prod(Z, T1) */ void countT(int n) { int k; if (NOINIT(T[n])==0) { countZ(1); countT1(n-1); mpz_mul(T[n],Z[1],T1[n-1]); } } /* T5 = ProdSeq(T, T3) */ void countT5(int n) { int k; countT4(n); } /* T1 = Union(T2, T5) */ void countT1(int n) { int k; if (NOINIT(T1[n])==0) { countT2(n); mpz_set(T1[n],T2[n]); countT5(n); mpz_add(T1[n],T1[n],T5[n]); } } /* Z = Atom(Z) */ void countZ(int n) { int k; if (NOINIT(Z[n])==0) { if (n==1) mpz_set_si(Z[n],1); else mpz_set_si(Z[n],0); } } /* T3 = Union(T2, T4) */ void countT3(int n) { int k; if (NOINIT(T3[n])==0) { countT2(n); mpz_set(T3[n],T2[n]); countT4(n); mpz_add(T3[n],T3[n],T4[n]); } } /* T2 = Epsilon(T2) */ void countT2(int n) { int k; if (NOINIT(T2[n])==0) { if (n==0) mpz_set_si(T2[n],1); else mpz_set_si(T2[n],0); } } /* T4 = ProdPrdSeq(T, T3) */ void drawT4(int n) { int k,c; countT4(n); mpz_random(s,mpz_size(T4[n])); mpz_mod(s,s,T4[n]); countT4(n); for (k=1;;k++) { countT(k); countT3(n-k); mpz_mul(tmp,T[k],T3[n-k]); mpz_add(s,s,tmp); if (mpz_cmp(s,T4[n])>=0) break; k=n+1-k; countT(k); countT3(n-k); mpz_mul(tmp,T[k],T3[n-k]); mpz_add(s,s,tmp); if (mpz_cmp(s,T4[n])>=0) break; k=n+1-k; } drawT(k); if ((n-k)>0) {putchar(','); drawT3(n-k);} } /* T = Prod(Z, T1) */ void drawT(int n) { int k,c; PROD_OPEN; drawZ(1); PROD_SEP; drawT1(n-1); PROD_CLOSE; } /* T5 = ProdSeq(T, T3) */ void drawT5(int n) { int k,c; countT5(n); mpz_random(s,mpz_size(T5[n])); mpz_mod(s,s,T5[n]); countT5(n); for (k=1;;k++) { countT(k); countT3(n-k); mpz_mul(tmp,T[k],T3[n-k]); mpz_add(s,s,tmp); if ((c=mpz_cmp(s,T5[n]))>=0) break; k=n+1-k; countT(k); countT3(n-k); mpz_mul(tmp,T[k],T3[n-k]); mpz_add(s,s,tmp); if ((c=mpz_cmp(s,T5[n]))>=0) break; k=n+1-k; } printf("Sequence("); drawT(k); if ((n-k)>0) {putchar(','); drawT3(n-k);} putchar(')'); } /* T1 = Union(T2, T5) */ void drawT1(int n) { int k,c; countT1(n); mpz_random(s,mpz_size(T1[n])); mpz_mod(s,s,T1[n]); countT2(n); mpz_add(s,s,T2[n]); if (mpz_cmp(s,T1[n])>=0) { drawT2(n); return; } else { countT5(n); mpz_add(s,s,T5[n]); if (mpz_cmp(s,T1[n])>=0) { drawT5(n); return; } } } /* Z = Atom(Z) */ void drawZ(int n) { int k,c; printf("Z"); } /* T3 = Union(T2, T4) */ void drawT3(int n) { int k,c; countT3(n); mpz_random(s,mpz_size(T3[n])); mpz_mod(s,s,T3[n]); countT2(n); mpz_add(s,s,T2[n]); if (mpz_cmp(s,T3[n])>=0) { drawT2(n); return; } else { countT4(n); mpz_add(s,s,T4[n]); if (mpz_cmp(s,T3[n])>=0) { drawT4(n); return; } } } /* T2 = Epsilon(T2) */ void drawT2(int n) { int k,c; EPSILON; }