void set_of_sets::init_simple(INT underlying_set_size, INT nb_sets, INT verbose_level) { INT f_v = (verbose_level >= 1); INT i; if (f_v) { cout << "set_of_sets::init_simple nb_sets=" << nb_sets << " underlying_set_size=" << underlying_set_size << endl; } set_of_sets::nb_sets = nb_sets; set_of_sets::underlying_set_size = underlying_set_size; Sets = NEW_PINT(nb_sets); Set_size = NEW_INT(nb_sets); for (i = 0; i < nb_sets; i++) { Sets[i] = NULL; } INT_vec_zero(Set_size, nb_sets); }
void set_of_sets::init_basic(INT underlying_set_size, INT nb_sets, INT *Sz, INT verbose_level) { INT f_v = (verbose_level >= 1); INT i; if (f_v) { cout << "set_of_sets::init_basic nb_sets=" << nb_sets << " underlying_set_size=" << underlying_set_size << endl; } set_of_sets::nb_sets = nb_sets; set_of_sets::underlying_set_size = underlying_set_size; Sets = NEW_PINT(nb_sets); Set_size = NEW_INT(nb_sets); for (i = 0; i < nb_sets; i++) { Sets[i] = NULL; } for (i = 0; i < nb_sets; i++) { Set_size[i] = Sz[i]; if (FALSE /*f_v*/) { cout << "set_of_sets::init_basic allocating set " << i << " of size " << Sz[i] << endl; } Sets[i] = NEW_INT(Sz[i]); } }
void strong_generators::orbits_light(action *A_given, INT *&Orbit_reps, INT *&Orbit_lengths, INT &nb_orbits, INT **&Pts_per_generator, INT *&Nb_per_generator, INT verbose_level) { INT f_v = (verbose_level >= 1); INT f_vv = FALSE; //(verbose_level >= 2); UBYTE *reached; INT Orbit_allocated; INT Orbit_len; INT *Orbit; INT *Q; INT Q_allocated; INT Q_len; INT pt, i, h, nb_gens, a, b, idx; INT Orbit_reps_allocated; INT nb_reached; INT *Generator_idx; if (f_v) { cout << "strong_generators::orbits_light degree = " << A_given->degree << endl; } Orbit_reps_allocated = 1024; Orbit_reps = NEW_INT(Orbit_reps_allocated); Orbit_lengths = NEW_INT(Orbit_reps_allocated); nb_orbits = 0; if (f_v) { cout << "strong_generators::orbits_light allocating array Generator_idx" << endl; } Generator_idx = NEW_INT(A_given->degree); if (f_v) { cout << "strong_generators::orbits_light allocating array Generator_idx done" << endl; } for (pt = 0; pt < A_given->degree; pt++) { Generator_idx[pt] = -1; } reached = bitvector_allocate(A_given->degree); nb_reached = 0; Orbit_allocated = 1024; Orbit = NEW_INT(Orbit_allocated); Q_allocated = 1024; Q = NEW_INT(Q_allocated); nb_gens = gens->len; if (A_given->degree > ONE_MILLION) { f_v = TRUE; } Nb_per_generator = NEW_INT(nb_gens); INT_vec_zero(Nb_per_generator, nb_gens); Pts_per_generator = NEW_PINT(nb_gens); for (pt = 0; pt < A_given->degree; pt++) { if (bitvector_s_i(reached, pt)) { continue; } if (f_vv) { cout << "strong_generators::orbits_light computing orbit of point " << pt << endl; } Q[0] = pt; Q_len = 1; Orbit[0] = pt; Orbit_len = 1; while (Q_len) { if (f_vv) { cout << "strong_generators::orbits_light considering the next element in the queue" << endl; } a = Q[0]; for (i = 1; i < Q_len; i++) { Q[i - 1] = Q[i]; } Q_len--; if (f_vv) { cout << "strong_generators::orbits_light looking at element " << a << endl; } for (h = 0; h < nb_gens; h++) { if (f_vv) { cout << "strong_generators::orbits_light applying generator " << h << endl; } b = A_given->element_image_of(a, gens->ith(h), FALSE); if (f_vv) { cout << "strong_generators::orbits_light under generator " << h << " it maps to " << b << endl; } if (!INT_vec_search(Orbit, Orbit_len, b, idx)) { if (Orbit_len == Orbit_allocated) { INT new_oa; INT *O; new_oa = 2 * Orbit_allocated; O = NEW_INT(new_oa); for (i = 0; i < Orbit_len; i++) { O[i] = Orbit[i]; } FREE_INT(Orbit); Orbit = O; Orbit_allocated = new_oa; } for (i = Orbit_len; i > idx; i--) { Orbit[i] = Orbit[i - 1]; } Orbit[idx] = b; Orbit_len++; Generator_idx[b] = h; Nb_per_generator[h]++; if (f_vv) { cout << "current orbit: "; INT_vec_print(cout, Orbit, Orbit_len); cout << endl; } bitvector_m_ii(reached, b, 1); nb_reached++; if (f_v && ((nb_reached & ((1 << 18) - 1)) == 0)) { cout << "strong_generators::orbits_light nb_reached = " << nb_reached << " / " << A_given->degree << endl; } if (Q_len == Q_allocated) { INT new_qa; INT *new_Q; new_qa = 2 * Q_allocated; new_Q = NEW_INT(new_qa); for (i = 0; i < Q_len; i++) { new_Q[i] = Q[i]; } FREE_INT(Q); Q = new_Q; Q_allocated = new_qa; } Q[Q_len++] = b; if (f_vv) { cout << "current Queue: "; INT_vec_print(cout, Q, Q_len); cout << endl; } } } // next h } // while (Q_len) if (f_vv) { cout << "Orbit of point " << pt << " has length " << Orbit_len << endl; } if (nb_orbits == Orbit_reps_allocated) { INT an; INT *R; INT *L; an = 2 * Orbit_reps_allocated; R = NEW_INT(an); L = NEW_INT(an); for (i = 0; i < nb_orbits; i++) { R[i] = Orbit_reps[i]; L[i] = Orbit_lengths[i]; } FREE_INT(Orbit_reps); FREE_INT(Orbit_lengths); Orbit_reps = R; Orbit_lengths = L; Orbit_reps_allocated = an; } Orbit_reps[nb_orbits] = pt; Orbit_lengths[nb_orbits] = Orbit_len; nb_orbits++; } // for pt if (f_v) { cout << "strong_generators::orbits_light degree = " << A_given->degree << " we found " << nb_orbits << " orbits" << endl; cout << i << " : " << Nb_per_generator[i] << endl; for (i = 0; i < nb_gens; i++) { cout << i << " : " << Nb_per_generator[i] << endl; } } if (f_v) { cout << "strong_generators::orbits_light computing the arrays Pts_per_generator" << endl; } for (i = 0; i < nb_gens; i++) { INT *v; INT j; v = NEW_INT(Nb_per_generator[i]); j = 0; for (pt = 0; pt < A_given->degree; pt++) { if (Generator_idx[pt] == i) { v[j] = pt; j++; } } if (j != Nb_per_generator[i]) { cout << "strong_generators::orbits_light j != Nb_per_generator[i]" << endl; exit(1); } Pts_per_generator[i] = v; } FREE_INT(Orbit); FREE_INT(Q); FREE_UBYTE(reached); FREE_INT(Generator_idx); //FREE_INT(Nb_per_generator); if (f_v) { cout << "strong_generators::orbits_light degree = " << A_given->degree << " we found " << nb_orbits << " orbits" << endl; } }
void generator::init(action *A, action *A2, strong_generators *gens, INT sz, INT verbose_level) { INT f_v = (verbose_level >= 1); INT f_vv = (verbose_level >= 2); //INT f_v6 = (verbose_level >= 6); INT i; if (f_v) { cout << "generator::init" << endl; cout << "generator::init sz = " << sz << endl; cout << "generator::init A->degree=" << A->degree << endl; cout << "generator::init A2->degree=" << A2->degree << endl; cout << "generator::init sz = " << sz << endl; } t0 = os_ticks(); progress_epsilon = 0.005; if (f_vv) { cout << "generator::init action A:" << endl; A->print_info(); cout << "generator::init action A2:" << endl; A2->print_info(); } gens->group_order(go); generator::A = A; generator::A2 = A2; if (f_v) { cout << "generator::init group order is "; cout << go << endl; } generator::sz = sz; if (f_v) { cout << "generator::init sz = " << sz << endl; } Strong_gens = gens; if (f_vv) { cout << "generator::init allocating S of size " << sz << endl; } S = NEW_INT(sz); for (i = 0; i < sz; i++) { S[i] = i; } tmp_set_apply_fusion = NEW_INT(sz); if (f_vv) { cout << "generator::init allocating Elt_memory" << endl; } Elt_memory = NEW_INT(5 * A->elt_size_in_INT); Elt1 = Elt_memory + 0 * A->elt_size_in_INT; Elt2 = Elt_memory + 1 * A->elt_size_in_INT; Elt3 = Elt_memory + 2 * A->elt_size_in_INT; Elt4 = Elt_memory + 3 * A->elt_size_in_INT; Elt5 = Elt_memory + 4 * A->elt_size_in_INT; transporter = new vector_ge; transporter->init(A); transporter->allocate(sz + 1); A->element_one(transporter->ith(0), FALSE); set = NEW_PINT(sz + 1); for (i = 0; i <= sz; i++) { set[i] = NEW_INT(sz); } nb_oracle_nodes_used = 0; nb_oracle_nodes_allocated = 0; nb_times_image_of_called0 = A->nb_times_image_of_called; nb_times_mult_called0 = A->nb_times_mult_called; nb_times_invert_called0 = A->nb_times_invert_called; nb_times_retrieve_called0 = A->nb_times_retrieve_called; nb_times_store_called0 = A->nb_times_store_called; if (f_v) { cout << "generator::init done" << endl; } }