Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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]);
    }
}
Ejemplo n.º 3
0
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;
		}
}
Ejemplo n.º 4
0
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;
		}
}