From 0f23a4b4772be7d5159b48502f6451a72fbd5106 Mon Sep 17 00:00:00 2001 From: Florian Stecker Date: Sat, 8 Mar 2025 11:56:27 -0500 Subject: [PATCH] color principal ideals --- graph.c | 125 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 76 insertions(+), 49 deletions(-) diff --git a/graph.c b/graph.c index 3da69da..5ef8cf2 100644 --- a/graph.c +++ b/graph.c @@ -1,16 +1,15 @@ -#include "weyl.h" #include "queue.h" +#include "weyl.h" -#include -#include #include +#include +#include -static char* alphabetize(weylgroup_element_t *e, char *str) -{ - if(e->wordlength == 0) +static char *alphabetize(weylgroup_element_t *e, char *str) { + if (e->wordlength == 0) sprintf(str, "1"); else { - for(int j = 0; j < e->wordlength; j++) + for (int j = 0; j < e->wordlength; j++) str[j] = e->word[j] + 'a'; str[e->wordlength] = 0; } @@ -18,55 +17,83 @@ static char* alphabetize(weylgroup_element_t *e, char *str) return str; } -int main(int argc, const char *argv[]) -{ - semisimple_type_t type; - unsigned long right_invariance, left_invariance; - doublequotient_t *dq; - const char *alphabet = "abcdefghijklmnopqrstuvwxyz"; - char stringbuffer[100]; - char stringbuffer2[100]; +int main(int argc, const char *argv[]) { + semisimple_type_t type; + unsigned long right_invariance, left_invariance; + doublequotient_t *dq; + const char *alphabet = "abcdefghijklmnopqrstuvwxyz"; + char stringbuffer[100]; + char stringbuffer2[100]; - ERROR(argc < 2, "Too few arguments!\n"); + ERROR(argc < 2, "Too few arguments!\n"); - type.n = 0; - for(int i = 0; i < argc - 1; i++) { - if(argv[i+1][0] < 'A' || argv[i+1][0] > 'G') - break; - type.n++; - } + type.n = 0; + for (int i = 0; i < argc - 1; i++) { + if (argv[i + 1][0] < 'A' || argv[i + 1][0] > 'G') + break; + type.n++; + } - type.factors = (simple_type_t*)malloc(type.n*sizeof(simple_type_t)); - for(int i = 0; i < type.n; i++) { - type.factors[i].series = argv[i+1][0]; - type.factors[i].rank = argv[i+1][1] - '0'; - ERROR(argv[i+1][0] < 'A' || argv[i+1][0] > 'G' || argv[i+1][1] < '1' || argv[i+1][1] > '9', "Arguments must be Xn with X out of A-G and n out of 1-9\n"); - } + type.factors = (simple_type_t *)malloc(type.n * sizeof(simple_type_t)); + for (int i = 0; i < type.n; i++) { + type.factors[i].series = argv[i + 1][0]; + type.factors[i].rank = argv[i + 1][1] - '0'; + ERROR(argv[i + 1][0] < 'A' || argv[i + 1][0] > 'G' || + argv[i + 1][1] < '1' || argv[i + 1][1] > '9', + "Arguments must be Xn with X out of A-G and n out of 1-9\n"); + } - left_invariance = right_invariance = 0; + left_invariance = right_invariance = 0; - if(argc - type.n >= 3) { - if(strcmp(argv[type.n + 1], "-") != 0) - for(int i = 0; i < strlen(argv[type.n + 1]); i++) - left_invariance |= (1 << (argv[type.n + 1][i] - 'a')); - if(strcmp(argv[type.n + 2], "-") != 0) - for(int i = 0; i < strlen(argv[type.n + 2]); i++) - right_invariance |= (1 << (argv[type.n + 2][i] - 'a')); - } + if (argc - type.n >= 3) { + if (strcmp(argv[type.n + 1], "-") != 0) + for (int i = 0; i < strlen(argv[type.n + 1]); i++) + left_invariance |= (1 << (argv[type.n + 1][i] - 'a')); + if (strcmp(argv[type.n + 2], "-") != 0) + for (int i = 0; i < strlen(argv[type.n + 2]); i++) + right_invariance |= (1 << (argv[type.n + 2][i] - 'a')); + } - // generate graph + // generate graph + dq = weyl_generate_bruhat(type, left_invariance, right_invariance); - dq = weyl_generate_bruhat(type, left_invariance, right_invariance); + // color ideals + int *color = (int*) malloc(dq->count * sizeof(int)); + memset(color, 0, dq->count * sizeof(int)); + for(int i = type.n+3; i < argc; i++) { + weylgroup_element_t *elem = &dq->group[0]; // identity + for(int j = 0; j < strlen(argv[i]); j++) { + int gen = argv[i][j] - 'a'; + elem = elem->right[gen]; + } + color[elem->coset->index] = 1; + } - fprintf(stdout, "digraph test123 {\n"); - for(int i = 0; i < dq->count; i++) - for(doublecoset_list_t *current = dq->cosets[i].bruhat_lower; current; current = current->next) - fprintf(stdout, "%s -> %s;\n", - alphabetize(dq->cosets[i].min, stringbuffer), - alphabetize(current->to->min, stringbuffer2)); - fprintf(stdout, "}\n\n"); + for(int i = dq->count - 1; i >= 0; i--) { + if(color[i] > 0) { + for(doublecoset_list_t *current = dq->cosets[i].bruhat_lower; current; current = current->next) { + color[current->to->index] = color[i]; + } + } + } - // clean up - weyl_destroy_bruhat(dq); - free(type.factors); + fprintf(stdout, "digraph bruhat {\n"); + for (int i = 0; i < dq->count; i++) { + fprintf(stdout, "%s [color=\"%s\"];\n", + alphabetize(dq->cosets[i].min, stringbuffer), + color[i] > 0 ? "red" : "black"); + + for (doublecoset_list_t *current = dq->cosets[i].bruhat_lower; current; current = current->next) { + fprintf(stdout, "%s -> %s [color=\"%s\"];\n", + alphabetize(dq->cosets[i].min, stringbuffer), + alphabetize(current->to->min, stringbuffer2), + color[i] > 0 ? "red" : "black"); + } + } + fprintf(stdout, "}\n\n"); + + // clean up + weyl_destroy_bruhat(dq); + free(color); + free(type.factors); }