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); } }
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); } }
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; } }