Example #1
0
void draw_empty_grid(INT q, INT type, INT param_a, INT xmax, INT ymax, INT verbose_level)
{
	{
	BYTE fname[1000];
	{
	mp_graphics *G;

	sprintf(fname, "grid_%ld_%ld", q, type);
	draw_beginning(fname, G, xmax, ymax, verbose_level);

	draw_grid_(*G, xmax, ymax, q, type, param_a);
	draw_end(fname, G, xmax, ymax, verbose_level);
	}
	prepare_latex_simple(fname, verbose_level);
	}
		
}
Example #2
0
void draw_empty_grid(INT q, INT f_include_line_at_infinity, INT verbose_level)
{
	{
	BYTE fname[1000];
	{
	INT xmax = 300;
	INT ymax = 300;
	mp_graphics *G;

	sprintf(fname, "grid_%ld_%ld", q, f_include_line_at_infinity);
	draw_beginning(fname, G, xmax, ymax, verbose_level);

	draw_grid_(*G, q, f_include_line_at_infinity, verbose_level);
	draw_end(fname, G, xmax, ymax, verbose_level);
	}
	prepare_latex_simple(fname, verbose_level);
	}
		
}
Example #3
0
void conic(INT q, INT *six_coeffs, INT xmax, INT ymax, INT f_do_stabilizer, INT verbose_level) 
{
	const BYTE *override_poly = NULL;
	finite_field F;
	projective_space *P;
	action *A;
	INT n = 3;
	//INT f_with_group = TRUE;
	
	INT v[3];
	//INT w[3];

	//F.init(q), verbose_level - 2);
	F.init_override_polynomial(q, override_poly, verbose_level);

	P = new projective_space;
	cout << "before P->init" << endl;
	P->init(n - 1, &F, 
		FALSE /* f_init_incidence_structure */, 
		verbose_level/*MINIMUM(2, verbose_level)*/);

	cout << "after P->init" << endl;
	A = new action;
	A->init_general_linear_group(n, &F, FALSE /* f_semilinear */, TRUE /* f_basis */, verbose_level - 2);
	
	INT variety[100];
	INT variety_size = 0;
	INT a, i, j, h;

	for (i = 0; i < P->N_points; i++) {
		P->unrank_point(v, i);
		a = F.evaluate_conic_form(six_coeffs, v);
		cout << i << " : ";
		INT_vec_print(cout, v, 3);
		cout << " : " << a << endl;
		if (a == 0) {
			variety[variety_size++] = i;
			}
		}
	cout << "the size of the variety is " << variety_size << endl;
	cout << "the variety is:" << endl;
	INT_vec_print(cout, variety, variety_size);
	cout << endl;
	for (i = 0; i < variety_size; i++) {
		P->unrank_point(v, variety[i]);
		a = F.evaluate_conic_form(six_coeffs, v);
		cout << i << " : ";
		INT_vec_print(cout, v, 3);
		cout << " : " << a << endl;
		}
	
#if 0
	INT pts[] = {2, 22, 6, 18, 10};
	find_collinear_triple(P, pts, 5);
	
	INT five_pts[] = {3, 6, 7, 28, 30};
#endif
	//INT six_coeffs[6];
	INT five_pts[5];
	five_pts[0] = variety[0];
	five_pts[1] = variety[1];
	five_pts[2] = variety[2];
	five_pts[3] = variety[3];
	five_pts[4] = variety[4];
	
	P->determine_conic_in_plane(five_pts, 5, six_coeffs, verbose_level);

	INT points[1000];
	INT tangents[1000];
	INT *exterior_points;
	INT *secants;
	INT nb_secants, nb_exterior_points;
	INT nb_points;
	//INT v[3];
	
	P->conic_points(five_pts, six_coeffs, points, nb_points, verbose_level);
	cout << "the " << nb_points << " conic points are: ";
	INT_vec_print(cout, points, nb_points);
	cout << endl;
	for (i = 0; i < nb_points; i++) {
		P->unrank_point(v, points[i]);
		cout << i << " : " << points[i] << " : ";
		INT_vec_print(cout, v, 3);
		cout << endl;
		}


	strong_generators *Aut_gens;


	if (f_do_stabilizer) {
		// computing stabilizer:

		cout << "computing stabilizer" << endl;
	
		set_stabilizer_compute STAB;
		sims *Stab;
		INT nb_backtrack_nodes;
	
		cout << "computing stabilizer of conic:" << endl;
		STAB.init(A, variety, variety_size /* points, nb_points*/ , verbose_level);
		STAB.compute_set_stabilizer(t0, nb_backtrack_nodes, Aut_gens, verbose_level + 10);
		longinteger_object go, go2;
		Stab = Aut_gens->create_sims(verbose_level - 1);
		Stab->group_order(go);
		cout << "computing stabilizer of conic done, found a group of order " << go << endl;

		delete Stab;
		}
	else {
		Aut_gens = NULL;
		}
	{
	BYTE fname[1000];
	{
	mp_graphics *G;
	INT f_include_line_at_infinity = TRUE;

	sprintf(fname, "conic_%ld", q);
	draw_beginning(fname, G, xmax, ymax, verbose_level);

	//variety_size = 0;
	draw_grid_(*G, q, f_include_line_at_infinity, verbose_level);
	draw_points(*G, P, /*variety + 3, 5*/ variety, variety_size /*points, nb_points*/, verbose_level);
	draw_end(fname, G, xmax, ymax, verbose_level);
	}
	if (f_do_stabilizer) {
		prepare_latex(fname, P, points, nb_points, Aut_gens, verbose_level);
		}
	}
		
	delete Aut_gens;
	return;
	
	P->find_tangent_lines_to_conic(six_coeffs, 
		points, nb_points, 
		tangents, verbose_level);

	cout << "the " << nb_points << " tangent lines are: ";
	INT_vec_print(cout, tangents, nb_points);
	cout << endl;

	nb_exterior_points = (nb_points * (nb_points - 1)) >> 1;
	nb_secants = nb_exterior_points;
	exterior_points = NEW_INT(nb_exterior_points);
	h = 0;
	for (i = 0; i < nb_points; i++) {
		for (j = i + 1; j < nb_points; j++) {
			exterior_points[h++] = P->Line_intersection[
				tangents[i] * P->N_lines + tangents[j]];
			}
		}
	INT_vec_heapsort(exterior_points, nb_exterior_points);
	cout << "the " << nb_exterior_points << " exterior points are: ";
	INT_vec_print(cout, exterior_points, nb_exterior_points);
	cout << endl;

	secants = NEW_INT(nb_secants);
	h = 0;
	for (i = 0; i < nb_points; i++) {
		for (j = i + 1; j < nb_points; j++) {
			secants[h++] = P->Line_through_two_points[
				points[i] * P->N_points + points[j]];
			}
		}
	INT_vec_heapsort(secants, nb_secants);
	cout << "the " << nb_secants << " secants are: ";
	INT_vec_print(cout, secants, nb_secants);
	cout << endl;

	INT *external_lines;
	INT nb_external_lines;
	
	external_lines = NEW_INT(P->N_lines);
	for (i = 0; i < P->N_lines; i++) {
		external_lines[i] = i;
		}
	nb_external_lines = P->N_lines;
	set_delete_elements(external_lines, nb_external_lines, tangents, nb_points);
	set_delete_elements(external_lines, nb_external_lines, secants, nb_secants);

	cout << "the " << nb_external_lines << " external lines are: ";
	INT_vec_print(cout, external_lines, nb_external_lines);
	cout << endl;
	
	INT *adjacency;
	INT idx;

	adjacency = NEW_INT(nb_external_lines * nb_external_lines);
	for (i = 0; i < nb_external_lines; i++) {
		adjacency[i * nb_external_lines + i] = 0;
		for (j = i + 1; j < nb_external_lines; j++) {
			a = P->Line_intersection[
				external_lines[i] * P->N_lines + external_lines[j]];
			if (INT_vec_search(exterior_points, nb_exterior_points, a, idx)) {
				adjacency[i * nb_external_lines + j] = 1;
				adjacency[j * nb_external_lines + i] = 1;
				}
			else {
				adjacency[i * nb_external_lines + j] = 0;
				adjacency[j * nb_external_lines + i] = 0;
				}
			}
		}
	cout << "adjacency matrix:" << endl;
	print_integer_matrix_width(cout, adjacency, 
		nb_external_lines, nb_external_lines, nb_external_lines, 
		1);
	INT *Edges1;
	INT *Edges2;
	INT *Incidence;
	INT nb_e = 0;
	for (i = 0; i < nb_external_lines; i++) {
		for (j = i + 1; j < nb_external_lines; j++) {
			if (adjacency[i * nb_external_lines + j])
				nb_e++;
			}
		}
	Edges1 = NEW_INT(nb_e);
	Edges2 = NEW_INT(nb_e);
	Incidence = NEW_INT(nb_external_lines * nb_e);
	for (i = 0; i < nb_external_lines * nb_e; i++) {
		Incidence[i] = 0;
		}

	nb_e = 0;
	for (i = 0; i < nb_external_lines; i++) {
		for (j = i + 1; j < nb_external_lines; j++) {
			if (adjacency[i * nb_external_lines + j]) {
				Edges1[nb_e] = i;
				Edges2[nb_e] = j;
				nb_e ++;
				}
			}
		}
	for (j = 0; j < nb_e; j++) {
		Incidence[Edges1[j] * nb_e + j] = 1;
		Incidence[Edges2[j] * nb_e + j] = 1;
		}

	BYTE fname[1000];
	sprintf(fname, "ext_lines_%ld.inc", P->F->q);
	{
	ofstream f(fname);

	f << nb_external_lines << " " << nb_e << " " << nb_e * 2 << endl;
	for (i = 0; i < nb_external_lines * nb_e; i++) {
		if (Incidence[i]) {
			f << i << " ";
			}
		}
	f << endl;
	f << -1 << endl;
	
	}
	cout << "written file " << fname << " of size " << file_size(fname) << endl;

	INT colors[] = {0,1};
	INT C = 2;
	INT *Pijk;
	
	Pijk = NEW_INT(C * C * C);
	if (analyze_color_graph(C, colors, nb_external_lines, adjacency, Pijk, verbose_level)) {
		cout << "is association scheme" << endl;
		}
	else {
		cout << "not an association scheme" << endl;
		}

	//exit(1);
	

	{
	set_stabilizer_compute STAB;
	strong_generators *Aut_gens;
	sims *Stab;
	//vector_ge gens;
	//INT *tl;
	INT nb_backtrack_nodes;

	cout << "computing stabilizer of conic:" << endl;
	STAB.init(A, points, nb_points, verbose_level);
	STAB.compute_set_stabilizer(t0, nb_backtrack_nodes, Aut_gens, verbose_level + - 2);
	Stab = Aut_gens->create_sims(verbose_level - 1);
	longinteger_object go, go2;
	Stab->group_order(go);
	cout << "computing stabilizer of conic done, found a group of order " << go << endl;

	
	action *A2;
	action A2r;
	INT f_induce_action = TRUE;

	projective_space_init_line_action(P, A, A2, verbose_level);
	A2r.induced_action_by_restriction(*A2, 
		f_induce_action, Stab, 
		nb_external_lines, external_lines, verbose_level);
	A2r.group_order(go2);
	cout << "induced action on external lines has order " << go2 << endl;

	for (i = 0; i < Aut_gens->gens->len; i++) {
		A2r.element_print_quick(Aut_gens->gens->ith(i), cout);
		A2->element_print_as_permutation(Aut_gens->gens->ith(i), cout);
		A2r.element_print_as_permutation(Aut_gens->gens->ith(i), cout);
		}
	delete Aut_gens;
	delete Stab;
	delete A2;
	}
}