int main(void) { char tmp[LEN]; int relation[NUM][NUM] = {{0}}; char label[NUM]; int n; int i; fgets(tmp, sizeof(tmp), stdin); sscanf(tmp, "%d", &n); set_label(label); for ( i = 0; i < n; i++ ) { if ( fgets(tmp, sizeof(tmp), stdin) == NULL ) { puts("Input Error"); return 0; } set_relation(relation, tmp); } graph_output(relation, label, n); return 0; }
/*========================================================================== evaluateSieve: Function: searches sieve for relations and sticks them into a matrix, then sticks their X and Y values into two arrays XArr and YArr ===========================================================================*/ static void evaluateSieve( unsigned long numPrimes, unsigned long Mdiv2, unsigned long * relations, unsigned long ctimesreps, unsigned long M, unsigned char * sieve, mpz_t A, mpz_t B, mpz_t C, unsigned long * soln1, unsigned long * soln2, unsigned char * flags, matrix_t m, mpz_t * XArr, unsigned long * aind, int min, int s, int * exponents, unsigned long * npartials, unsigned long * nrelsfound, unsigned long * nrelssought, mpz_t temp, mpz_t temp2, mpz_t temp3, mpz_t res) { long i,j,ii; unsigned int k; unsigned int exponent, vv; unsigned char extra; unsigned int modp; unsigned long * sieve2; unsigned char bits; int numfactors; unsigned long relsFound = *nrelsfound; unsigned long relSought = *nrelssought; mpz_set_ui(temp, 0); mpz_set_ui(temp2, 0); mpz_set_ui(temp3, 0); mpz_set_ui(res, 0); i = 0; j = 0; sieve2 = (unsigned long *) sieve; #ifdef POLS gmp_printf("%Zdx^2%+Zdx\n%+Zd\n",A,B,C); #endif while ( (unsigned long)j < M/sizeof(unsigned long)) { do { while (!(sieve2[j] & SIEVEMASK)) j++; i = j * sizeof(unsigned long); j++; while (((unsigned long)i < j*sizeof(unsigned long)) && (sieve[i] < threshold)) i++; } while (sieve[i] < threshold); if (((unsigned long)i<M) && (relsFound < relSought)) { mpz_set_ui(temp,i+ctimesreps); mpz_sub_ui(temp, temp, Mdiv2); /* X */ mpz_set(temp3, B); /* B */ mpz_addmul(temp3, A, temp); /* AX+B */ mpz_add(temp2, temp3, B); /* AX+2B */ mpz_mul(temp2, temp2, temp); /* AX^2+2BX */ mpz_add(res, temp2, C); /* AX^2+2BX+C */ bits = mpz_sizeinbase(res,2) - errorbits; numfactors=0; extra = 0; memset(exponents, 0, firstprime * sizeof(int)); if (factorBase[0] != 1 && mpz_divisible_ui_p(res, factorBase[0])) { extra += primeSizes[0]; if (factorBase[0] == 2) { exponent = mpz_scan1(res, 0); mpz_tdiv_q_2exp(res, res, exponent); } else { mpz_set_ui(temp,factorBase[0]); exponent = mpz_remove(res,res,temp); } exponents[0] = exponent; } exponents[1] = 0; if (mpz_divisible_ui_p(res, factorBase[1])) { extra += primeSizes[1]; if (factorBase[1] == 2) { exponent = mpz_scan1(res, 0); mpz_tdiv_q_2exp(res, res, exponent); } else { mpz_set_ui(temp,factorBase[1]); exponent = mpz_remove(res,res,temp); } exponents[1] = exponent; } for (k = 2; k < firstprime; k++) { modp=(i+ctimesreps)%factorBase[k]; exponents[k] = 0; if (soln2[k] != (unsigned long)-1) { if ((modp==soln1[k]) || (modp==soln2[k])) { extra+=primeSizes[k]; mpz_set_ui(temp,factorBase[k]); exponent = mpz_remove(res,res,temp); CHECK_EXPONENT(exponent, k); PRINT_FB(exponent, k); exponents[k] = exponent; } } else if (mpz_divisible_ui_p(res, factorBase[k])) { extra += primeSizes[k]; mpz_set_ui(temp,factorBase[k]); exponent = mpz_remove(res,res,temp); PRINT_FB(exponent, k); exponents[k] = exponent; } } sieve[i]+=extra; if (sieve[i] >= bits) { vv=((unsigned char)1<<(i&7)); for (k = firstprime; (k<secondprime)&&(extra<sieve[i]); k++) { modp=(i+ctimesreps)%factorBase[k]; if (soln2[k] != (unsigned long)-1) { if ((modp==soln1[k]) || (modp==soln2[k])) { extra+=primeSizes[k]; mpz_set_ui(temp,factorBase[k]); exponent = mpz_remove(res,res,temp); CHECK_EXPONENT(exponent, k); PRINT_FB(exponent, k); if (exponent) for (ii = 0; ii < (long)exponent; ii++) set_relation(relations, relsFound, ++numfactors, k); if (exponent & 1) insertEntry(m,relsFound,k); } } else if (mpz_divisible_ui_p(res, factorBase[k])) { extra += primeSizes[k]; mpz_set_ui(temp,factorBase[k]); exponent = mpz_remove(res,res,temp); PRINT_FB(exponent, k); for (ii = 0; ii < (long)exponent; ii++) set_relation(relations, relsFound, ++numfactors, k); if (exponent & 1) insertEntry(m,relsFound,k); } } for (k = secondprime; (k<numPrimes)&&(extra<sieve[i]); k++) { if (flags[k]&vv) { modp=(i+ctimesreps)%factorBase[k]; if ((modp==soln1[k]) || (modp==soln2[k])) { extra+=primeSizes[k]; mpz_set_ui(temp,factorBase[k]); exponent = mpz_remove(res,res,temp); CHECK_EXPONENT(exponent, k); PRINT_FB(exponent, k); if (exponent) for (ii = 0; ii < (long)exponent; ii++) set_relation(relations, relsFound, ++numfactors, k); if (exponent & 1) insertEntry(m,relsFound,k); } } } for (ii =0; ii<s; ii++) { xorEntry(m,relsFound,aind[ii]+min); set_relation(relations, relsFound, ++numfactors, aind[ii]+min); } if (mpz_cmp_ui(res,1000)>0) { if (mpz_cmp_ui(res,largeprime)<0) { (*npartials)++; } clearRow(m,numPrimes,relsFound); #ifdef RELPRINT gmp_printf(" %Zd\n",res); #endif } else { mpz_neg(res,res); if (mpz_cmp_ui(res,1000)>0) { if (mpz_cmp_ui(res,largeprime)<0) { (*npartials)++; } clearRow(m,numPrimes,relsFound); #ifdef RELPRINT gmp_printf(" %Zd\n",res); #endif } else { #ifdef RELPRINT printf("....R\n"); #endif for (ii = 0; ii < (long)firstprime; ii++) { int jj; for (jj = 0; jj < exponents[ii]; jj++) set_relation(relations, relsFound, ++numfactors, ii); if (exponents[ii] & 1) insertEntry(m,relsFound,ii); } set_relation(relations, relsFound, 0, numfactors); mpz_init_set(XArr[relsFound], temp3); /* (AX+B) */ relsFound++; #ifdef COUNT if (relsFound%20==0) fprintf(stderr,"%lu relations, %lu partials.\n", relsFound, *npartials); #endif } } } else { clearRow(m,numPrimes,relsFound); #ifdef RELPRINT printf("\r \r"); #endif } i++; } else if (relsFound >= relSought) i++; } /* Update caller */ *nrelsfound = relsFound; *nrelssought = relSought; }
int AssocPair::change_status(int iface_no, iRel_RelationStatus status) { if (relStatus[iface_no] == status) RETURNR(iBase_SUCCESS); relStatus[iface_no] = status; if (status == iRel_NOTEXIST) { // Destroy the assoc tag CHK_ERRORR( relSides[iface_no]->destroy_relation_side() ); } else if (status == iRel_INACTIVE) { // Create the assoc tag CHK_ERRORR( relSides[iface_no]->create_relation_side() ); } // Update the assoc tag else if (status == iRel_ACTIVE) { CHK_ERRORR( relSides[iface_no]->destroy_relation_side() ); CHK_ERRORR( relSides[iface_no]->create_relation_side() ); if (entOrSet[!iface_no] == iRel_ENTITY) { iBase_EntityHandle *entities = NULL; int ent_alloc = 0, ent_size; CHK_ERRORR( relSides[!iface_no]->get_related_ents(&entities, &ent_alloc, &ent_size) ); if (entOrSet[iface_no] == iRel_ENTITY) { std::vector<iBase_EntityHandle> related_ents(ent_size); int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_ents[0]); if (result == iBase_SUCCESS) { if (iface_no == 0) for (int i = 0; i < ent_size; i++) CHK_ERRORR( set_relation(related_ents[i], entities[i]) ); else for (int i = 0; i < ent_size; i++) CHK_ERRORR( set_relation(entities[i], related_ents[i]) ); } } else { std::vector<iBase_EntitySetHandle> related_sets(ent_size); int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_sets[0]); if (result == iBase_SUCCESS) { if (iface_no == 0) for (int i = 0; i < ent_size; i++) CHK_ERRORR( set_relation(related_sets[i], entities[i]) ); else for (int i = 0; i < ent_size; i++) CHK_ERRORR( set_relation(entities[i], related_sets[i]) ); } } free(entities); } else { iBase_EntitySetHandle *sets = NULL; int set_alloc = 0, set_size; CHK_ERRORR( relSides[!iface_no]->get_related_sets(&sets, &set_alloc, &set_size) ); if (entOrSet[iface_no] == iRel_ENTITY) { std::vector<iBase_EntityHandle> related_ents(set_size); int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_ents[0]); if (result == iBase_SUCCESS) { if (iface_no == 0) for (int i = 0; i < set_size; i++) CHK_ERRORR( set_relation(related_ents[i], sets[i]) ); else for (int i = 0; i < set_size; i++) CHK_ERRORR( set_relation(sets[i], related_ents[i]) ); } } else { std::vector<iBase_EntitySetHandle> related_sets(set_size); int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_sets[0]); if (result == iBase_SUCCESS) { if (iface_no == 0) for (int i = 0; i < set_size; i++) CHK_ERRORR( set_relation(related_sets[i], sets[i]) ); else for (int i = 0; i < set_size; i++) CHK_ERRORR( set_relation(sets[i], related_sets[i]) ); } } free(sets); } } else { ERRORR(iBase_INVALID_ARGUMENT, "Invalid argument for relation status"); } RETURNR(iBase_SUCCESS); }