void ada_write_sols ( PolySolSet& sols ) { int fail = solcon_clear_quaddobl_solutions(); if(fail != 0) std::cout << "failed to clear the solutions" << std::endl; int dim = sols.dim; int nbsols = sols.n_sol; for(int sol_idx=0; sol_idx<nbsols; sol_idx++) { CT* sol = sols.get_sol(sol_idx); double csol[8*dim+20]; csol[0] = 0.0; csol[1] = 0.0; csol[2] = 0.0; csol[3] = 0.0; csol[4] = 0.0; csol[5] = 0.0; csol[6] = 0.0; csol[7] = 0.0; int idx = 8; for(int k=0; k<dim; k++) { csol[idx++] = sol[k].real.x[0]; csol[idx++] = sol[k].real.x[1]; csol[idx++] = sol[k].real.x[2]; csol[idx++] = sol[k].real.x[3]; csol[idx++] = sol[k].imag.x[0]; csol[idx++] = sol[k].imag.x[1]; csol[idx++] = sol[k].imag.x[2]; csol[idx++] = sol[k].imag.x[3]; } csol[8*dim+8] = 0.0; csol[8*dim+9] = 0.0; csol[8*dim+10] = 0.0; csol[8*dim+11] = 0.0; csol[8*dim+12] = 0.0; csol[8*dim+13] = 0.0; csol[8*dim+14] = 0.0; csol[8*dim+15] = 0.0; csol[8*dim+16] = 0.0; csol[8*dim+17] = 0.0; csol[8*dim+18] = 0.0; csol[8*dim+19] = 0.0; fail = solcon_append_quaddobl_solution(dim,1,csol); if(fail != 0) std::cout << "failed to append the solution" << std::endl; } }
int quaddobl_monodromy_breakup ( int nbloops, int n, int k, int d ) { int fail,i,j,done; double err,dis; fail = initialize_quaddobl_sampler(k); fail = initialize_quaddobl_monodromy(nbloops,d,k); if(verbose>0) printf("\nInitialized sampler and monodromy permutations ...\n"); fail = store_quaddobl_solutions(); /* store in monodromy permutations */ printf("... initializing the grid in quad double precision ...\n"); for(i=1; i<=2; i++) /* initialize grid for trace validation */ { fail = set_quaddobl_trace_slice(i); /* fix constant of slice */ fail = store_quaddobl_gammas(n); /* generate random gamma constants */ fail = quaddobl_track_paths(); fail = store_quaddobl_solutions(); /* store solutions in the grid */ fail = restore_quaddobl_solutions(); /* use original sols at start */ fail = swap_quaddobl_slices(); /* go back to original slices */ } fail = quaddobl_trace_grid_diagnostics(&err,&dis); printf("Trace grid diagnostics : \n"); printf(" largest error of the samples : %.3e\n", err); printf(" smallest distance between samples : %.3e\n", dis); done = 0; for(i=1; (i<=nbloops) && (done==0); i++) /* perform monodromy loops */ { printf("... starting loop #\%d in quad double precision ...\n",i); fail = new_quaddobl_slices(k,n); fail = store_quaddobl_gammas(n); fail = quaddobl_track_paths(); /* swapping slices happens here */ fail = solcon_clear_quaddobl_solutions(); fail = store_quaddobl_gammas(n); fail = quaddobl_track_paths(); fail = store_quaddobl_solutions(); { int permutation[d]; fail = permutation_after_quaddobl_loop(d,permutation); printf("the permutation at step %d:",i); for(j=0; j<d; j++) printf(" %d",permutation[j]); printf("\n"); } fail = quaddobl_monodromy_permutation(d,&done); { int nf,deg,jp,w[d]; double trace_difference; fail = number_of_quaddobl_factors(&nf); printf("number of irreducible factors : %d\n",nf); for(j=1; j<=nf; j++) { fail = witness_points_of_quaddobl_factor(j,°,w); printf(" %d :",j); for(jp=0; jp<deg; jp++) printf(" %d",w[jp]); fail = quaddobl_trace_sum_difference(deg,w,&trace_difference); printf(" : %.3e\n",trace_difference); } } fail = restore_quaddobl_solutions(); } if(done==1) printf("Found factorization using %d loops.\n", i-1); else printf("Failed to factor using %d loops.\n", i-1); return fail; }