GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
/* last change: 24.05.2002 by Oliver Heidbuechel */123#include <ZZ.h>4#include <typedef.h>5#include <presentation.h>6#include <matrix.h>7#include <bravais.h>8#include <base.h>9#include <datei.h>10#include <graph.h>11#include <gmp.h>12#include <zass.h>13#include <tools.h>14#include <longtools.h>15#include <sort.h>161718/* ================================================================= */19/* Der Quellcode wurde normalop.c (identify) entnommen!!! */20/* Stelle G->normal auf H^1(G, Q^n/Z^n) dar. */21/* ================================================================= */22/* G: Gruppe */23/* H_G_Z: H^1(G, Q^n/Z^n) */24/* ================================================================= */25static matrix_TYP **stelle_normalisator_dar(bravais_TYP *G,26matrix_TYP **H_G_Z)27{28matrix_TYP **N;2930int i;3132/* put_bravais(G, 0, 0); */3334N = (matrix_TYP **)calloc(G->normal_no, sizeof(matrix_TYP *));35for (i = 0; i < G->normal_no; i++){36N[i] = normalop(H_G_Z[0], H_G_Z[1], H_G_Z[2], G, G->normal[i], i == (G->normal_no - 1));37if (INFO_LEVEL & 16){38put_mat(N[i], NULL, "N[i]", 2);39}40}4142return(N);43}4445/*46Uebersetzungstabelle:4748cozykle: H_G_Z[0]49D: H_G_Z[1]50R: H_G_Z[2]5152*/53545556/* ================================================================= */57/* Der Quellcode wurde dem Programm Extensions entnommen!!! */58/* Berechne die Ordnung von H^1(G,Q^n/Z^n)! */59/* ================================================================= */60/* H_G_Z: H^1(G, Q^n/Z^n) */61/* ================================================================= */62static int CohomSize(matrix_TYP **H_G_Z)63{64int n;6566MP_INT cohom_size;676869if (H_G_Z[0]->cols <1){70return(1);71}72else {73cohom_size = cohomology_size(H_G_Z[1]);74n = mpz_get_ui(&cohom_size);75mpz_clear(&cohom_size);76return(n);77}78}7980818283/* ================================================================= */84/* Berechne den Stabilisator von elem + Ker phi */85/* ================================================================= */86/* H1_mod_ker: Daten ueber H^1 / ker (phi) */87/* S1: Stabilisator */88/* new_rep: representation from S1 on H^1(G,Q^n/lattice) / Ker(phi) */89/* S1_word_no: Anzahl der Elemente von new_rep */90/* elem: Repraesentant von elem + Ker phi */91/* H_GL_Z: H^1(GL, Q^n/Z^n) isom. zu H^1(G, Q^n/L) */92/* counter: hier wird die Anzahl der Stabilisatorerzeuger gespeichert*/93/* ================================================================= */94static matrix_TYP **stab_preimage_Ker(H1_mod_ker_TYP H1_mod_ker,95matrix_TYP **S1,96matrix_TYP **new_rep,97int S1_word_no,98matrix_TYP *elem,99matrix_TYP **H_GL_Z,100int *counter)101{102int reps_no, *length, m, k,103***WORDS, *WORDS_no;104105matrix_TYP ***reps, **S_ksi, *temp, **S1_inv, *std;106107108109/* Berechne Standardform von elem als Element von H^1/Ker */110/*if (elem == NULL){111temp = init_mat(H1_mod_ker.i->rows, 1, "");112}113else{*/114temp = mat_mul(H1_mod_ker.i, elem);115/*}*/116for (k = 0; k < temp->rows; k++){117temp->array.SZ[k][0] %= H1_mod_ker.D->array.SZ[k][k];118if (temp->array.SZ[k][0] < 0)119temp->array.SZ[k][0] += H1_mod_ker.D->array.SZ[k][k];120}121std = init_mat(H1_mod_ker.erz_no, 1, "");122for (k = 0; k < H1_mod_ker.erz_no; k++){123std->array.SZ[k][0] = temp->array.SZ[k + H1_mod_ker.D_first][0];124}125free_mat(temp);126127/* Bahn von elem sowie dessen Stabilisator berechnen */128reps = H1_mod_ker_orbit_alg(H1_mod_ker, new_rep, S1_word_no, &reps_no,129&length, &WORDS, &WORDS_no, std);130free_mat(std);131if (reps_no != 2 || length[1] < 1){132fprintf(stderr, "ERROR 1 in stab_preimage_Ker!\n");133exit(78);134}135136/* Berechne Stabilisator */137S1_inv = (matrix_TYP **)calloc(S1_word_no, sizeof(matrix_TYP *));138counter[0] = 0;139S_ksi = (matrix_TYP **)calloc(WORDS_no[1], sizeof(matrix_TYP *));140for (m = 0; m < WORDS_no[1]; m++){141/* simplify the words */142normalize_word(WORDS[1][m]);143if (WORDS[1][m][0] == 1 && WORDS[1][m][1] < 0)144WORDS[1][m][1] *= (-1);145if (word_already_there(WORDS[1], m) == 0){146S_ksi[counter[0]] = graph_mapped_word(WORDS[1][m], S1, S1_inv, H_GL_Z[1]);147if (mat_search(S_ksi[counter[0]], S_ksi, counter[0], mat_comp) != -1){148free_mat(S_ksi[counter[0]]);149}150else{151mat_quicksort(S_ksi, 0, counter[0], mat_comp);152counter[0]++;153}154}155}156157/* clean */158/* ===== */159for (m = 0; m < S1_word_no; m++){160if (S1_inv[m] != NULL)161free_mat(S1_inv[m]);162}163free(S1_inv);164for (m = 0; m < WORDS_no[1]; m++){165free(WORDS[1][m]);166}167for (m = 0; m < length[1]; m++){168free_mat(reps[1][m]);169}170free(reps[1]);171free(WORDS[1]);172free(reps);173free(WORDS);174free(WORDS_no);175free(length);176177return(S_ksi);178}179180181182183/* ================================================================= */184/* Der Quellcode wurde subgroupgraph.c entnommen!!! */185/* Berechne Vertreter der Bahnen der Untergruppen unter dem */186/* Stab des Gitters geschnitten mit dem Stabilisator des Cocykels */187/* als Element von H^1(G, Q^n/L)!!! */188/* ================================================================= */189/* G: Punktruppe */190/* GL: G konjugiert mit Gitter lattice */191/* H_G_Z: H^1(G, Q^n/Z^n) */192/* H_GL_Z: H^1(GL, Q^n/Z^n) isom. zu H^1(G, Q^n/L) */193/* lattice: Gitter */194/* phi: H^1(G, Q^n/L) isom. zu H^1(GL,Q^n,Z^n) -> H^1(G,Q^n/Z^n) */195/* H_1_mod_ker: Daten ueber H^1 / ker (phi) */196/* preimage: Element aus H^1(GL, Q^n/Z^n), welches auf Cozykel zur */197/* Raumgruppe abgebildet wird. */198/* kernel_mat: Matrix, die den Kern von phi beschreibt */199/* orbit_no: speichere die Anzahl der Vertreter hier */200/* orbit_length: speichere die Laengen der Bahnen hier */201/* ================================================================= */202matrix_TYP **calculate_representatives(bravais_TYP *G,203bravais_TYP *GL,204matrix_TYP **H_G_Z,205matrix_TYP **H_GL_Z,206matrix_TYP *lattice,207matrix_TYP *phi,208H1_mod_ker_TYP H1_mod_ker,209matrix_TYP *preimage,210matrix_TYP *kernel_mat,211int *orbit_no,212int **orbit_length)213{214matrix_TYP **S1,215**S1_inv,216**lNli,217**Ninv,218**new_rep,219*invlattice,220**N_H_GL_Z,221*id,222**S_ksi,223**kernel_gen,224**kernel_elements,225**orbit_rep,226**rep;227228int l,229norm_no, S1_word_no, cohomSize,230kernel_order, S_ksi_no,231*kernel_list;232233rational eins;234235236237eins.z = eins.n = 1;238239240/* calculate S1 = Stab_N(L) */241/* ======================== */242if (phi->cols > 0){243norm_no = GL->normal_no;244invlattice = mat_inv(lattice);245id = init_mat(G->dim, G->dim, "1");246Ninv = (matrix_TYP **)calloc(norm_no, sizeof(matrix_TYP *));247lNli = (matrix_TYP **)calloc(norm_no, sizeof(matrix_TYP *));248for (l = 0; l < norm_no; l++){249lNli[l] = mat_kon(lattice, GL->normal[l], invlattice);250}251free_mat(invlattice);252N_H_GL_Z = stelle_normalisator_dar(GL, H_GL_Z);253S1 = calculate_S1(id, lNli, norm_no, &S1_word_no, N_H_GL_Z, Ninv, H_GL_Z[1]);254255S1_inv = (matrix_TYP **)calloc(S1_word_no, sizeof(matrix_TYP *));256for (l = 0; l < norm_no; l++){257free_mat(lNli[l]);258free_mat(N_H_GL_Z[l]);259if (Ninv[l] != NULL)260free_mat(Ninv[l]);261}262free_mat(id);263free(lNli);264free(Ninv);265free(N_H_GL_Z);266}267else{268/* trivial part */269S1_word_no = 0;270}271272cohomSize = CohomSize(H_GL_Z);273274/* Kern */275kernel_gen = col_to_list(kernel_mat);276kernel_elements = (matrix_TYP **)calloc(cohomSize, sizeof(matrix_TYP *));277kernel_list = aufspannen(cohomSize, kernel_elements, kernel_gen,278kernel_mat->cols, H_GL_Z[1], &kernel_order);279280281if (H1_mod_ker.flag == 0 && H1_mod_ker.erz_no > 0){282if (preimage == NULL){283rep = orbit_ker(kernel_elements, kernel_order, H_GL_Z[1], S1,284S1_word_no, cohomSize, kernel_list, orbit_no, orbit_length);285}286else{287/* representation from S1 on H^1(G,Q^n/lattice) / Ker(phi) */288new_rep = new_representation(S1, S1_word_no, H1_mod_ker, H_GL_Z[1]);289290/* affine representation of the kernel */291kernel_elements_2_affine(kernel_elements, cohomSize);292293/* calculate Stab_S1 (preimage + Kern) */294S_ksi = stab_preimage_Ker(H1_mod_ker, S1, new_rep, S1_word_no, preimage, H_GL_Z, &S_ksi_no);295296/* calculate representatives */297orbit_rep = orbit_ksi_plus_ker(preimage, kernel_elements, kernel_order,298H_GL_Z[1], S_ksi, S_ksi_no, cohomSize,299kernel_list, orbit_no, orbit_length);300rep = (matrix_TYP **)calloc(orbit_no[0], sizeof(matrix_TYP *));301for (l = 0; l < orbit_no[0]; l++){302rep[l] = mat_add(orbit_rep[l], preimage, eins, eins);303free_mat(orbit_rep[l]);304}305free(orbit_rep);306for (l = 0; l < S_ksi_no; l++)307free_mat(S_ksi[l]);308free(S_ksi);309for (l = 0; l < S1_word_no; l++)310free_mat(new_rep[l]);311free(new_rep);312}313}314else{315switch (H1_mod_ker.flag){316case 0:317case 2:318/* orbit on 0 + Ker(phi) */319rep = orbit_ker(kernel_elements, kernel_order, H_GL_Z[1], S1,320S1_word_no, cohomSize, kernel_list, orbit_no, orbit_length);321break;322case 1:323case 3:324rep = (matrix_TYP **)calloc(1, sizeof(matrix_TYP *));325rep[0] = init_mat(0, 0, "");326orbit_length[0] = (int *)calloc(1, sizeof(int));327orbit_length[0][0] = 1;328orbit_no[0] = 1;329break;330default:331fprintf(stderr, "ERROR 1 in cacluate_representative!\n");332exit(55);333}334}335336337/* clean */338/* ===== */339if (phi->cols > 0){340for (l = 0; l < S1_word_no; l++){341free_mat(S1[l]);342if (S1_inv[l] != NULL)343free_mat(S1_inv[l]);344}345free(S1);346free(S1_inv);347}348for (l = 0; l < cohomSize; l++){349if (kernel_elements[l] != NULL)350free_mat(kernel_elements[l]);351}352free(kernel_elements);353free(kernel_list);354for (l = 0; l < kernel_mat->cols; l++){355free_mat(kernel_gen[l]);356}357free(kernel_gen);358359360return(rep);361}362363364365366/*367Uebersetzungstabelle:368=====================369370data->Z[j] GL371data->Z[i] G372data->X[j] H_GL_Z373data->X[i] H_G_Z374data->N[j] N_H_GL_Z375376377*/378379380381