70 lines
1.6 KiB
C
70 lines
1.6 KiB
C
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <malloc.h>
|
||
|
|
||
|
#include "weyl.h"
|
||
|
|
||
|
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++)
|
||
|
str[j] = e->word[j] + 'a';
|
||
|
str[e->wordlength] = 0;
|
||
|
}
|
||
|
|
||
|
return str;
|
||
|
}
|
||
|
|
||
|
static int apply_reflection(double *in, double *out, int rank, int reflection)
|
||
|
{
|
||
|
memcpy(out, in, rank*sizeof(double));
|
||
|
out[reflection] *= -1;
|
||
|
if(reflection != 0)
|
||
|
out[reflection-1] += in[reflection];
|
||
|
if(reflection != rank-1)
|
||
|
out[reflection+1] += in[reflection];
|
||
|
}
|
||
|
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
semisimple_type_t type;
|
||
|
simple_type_t simple;
|
||
|
doublequotient_t *dq;
|
||
|
double *vector;
|
||
|
char buf[1000];
|
||
|
|
||
|
type.n = 1;
|
||
|
type.factors = &simple;
|
||
|
simple.series = 'A';
|
||
|
simple.rank = 3;
|
||
|
|
||
|
dq = weyl_generate_bruhat(type, 0, 0);
|
||
|
|
||
|
int order = weyl_order(type);
|
||
|
int rank = weyl_rank(type);
|
||
|
weylgroup_element_t *group = dq->group;
|
||
|
vector = malloc(weyl_order(type)*weyl_rank(type)*sizeof(double));
|
||
|
|
||
|
for(int i = 0; i < rank; i++) {
|
||
|
vector[i] = 1.0;
|
||
|
}
|
||
|
|
||
|
for(int i = 0; i < order; i++) {
|
||
|
printf("%s %.2f %.2f %.2f\n", alphabetize(&group[i], buf),
|
||
|
1.0/4.0*(3*vector[3*i] + 2*vector[3*i+1] + 1*vector[3*i+2]),
|
||
|
1.0/4.0*(2*vector[3*i] + 4*vector[3*i+1] + 2*vector[3*i+2]),
|
||
|
1.0/4.0*(1*vector[3*i] + 2*vector[3*i+1] + 3*vector[3*i+2]));
|
||
|
|
||
|
for(int j = 0; j < rank; j++)
|
||
|
if(group[i].left[j]->wordlength > group[i].wordlength)
|
||
|
apply_reflection(&vector[3*i], &vector[3*group[i].left[j]->index], rank, j);
|
||
|
}
|
||
|
|
||
|
weyl_destroy_bruhat(dq);
|
||
|
free(vector);
|
||
|
|
||
|
return 0;
|
||
|
}
|