javac GL2R.java
java GL2R
0=>0
1=>1
2=>2
3=>3
4=>5
5=>4
1 2 3 4 5 6
2 1 5 6 3 4
3 6 1 5 4 2
4 5 6 1 2 3
5 4 2 3 6 1
6 3 4 2 1 5
interface IGroup {
void printSet();
void printTable();
int mul(int a,int b);
int size();
int inv(int a);
}
class DM2{
public double a,b,c,d;
public DM2(double a, double b,double c, double d){
init(a,b,c,d);
}
public void init(double a, double b,double c, double d){
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
public static DM2 create(double a, double b,double c, double d){
DM2 ret=new DM2(a,b,c,d);
return ret;
}
public static boolean IsEqual(DM2 t,DM2 a)
{
final double err=0.01;
if(Math.abs(t.a-a.a)<err && Math.abs(t.b-a.b)<err && Math.abs(t.c-a.c)<err && Math.abs(t.d-a.d)<err)
return true;
return false;
}
public static DM2 Mul(DM2 t,DM2 m){
DM2 ret = new DM2(t.a * m.a+t.b * m.c,t.a * m.b+t.b * m.d, t.c * m.a+t.d * m.c, t.c * m.b+t.d * m.d);
return ret;
}
}
// GL(2,R)的N阶有限子群
public class GL2R implements IGroup {
DM2[] m_Set;
//int[][] m_Mul;
// 静态函数
public static int getidx(DM2 Set[],DM2 a){
int n=Set.length;
for(int i=0;i<n;i++){
if(DM2.IsEqual(Set[i],a))
return i;
}
return -1;
}
public static void printGroup(IGroup g){
int n=g.size();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int ij=g.mul(i,j);
System.out.printf("%d ",ij+1);
}
System.out.printf("\n");
}
}
// 实现接口的方法
public void printSet() {
for(int i=0;i<size();i++){
int i1=inv(i);
System.out.printf("%d=>%d\n",i,i1);
}
}
public void printTable() {
printGroup(this);
}
public int mul(int a,int b){
// if(true){
// int c=m_Mul[a][b];
// return c;
// }else{
DM2 t=m_Set[a];
DM2 m=m_Set[b];
DM2 tm=DM2.Mul(t,m);
int ij=getidx(m_Set,tm);
return ij;
// }
}
public int size(){
return m_Set.length;
}
public int inv(int a){
DM2 mi=m_Set[a];
DM2 m0=m_Set[0];
DM2 m1=mi;
while(!DM2.IsEqual(mi,m0)){
m1=mi;
mi=DM2.Mul(mi,m_Set[a]);
}
int ij=getidx(m_Set,m1);
return ij;
}
// public GL2R(){
// initD3();
// //initTable();
// }
public void initD3(){
double pi=Math.atan2(0,-1);
//System.out.printf("pi=%f\n",pi);
double arr[][]=new double[][]{
{1,0,0,1},
{-1,0,0,1},//b
{-Math.cos(2*pi/3),-Math.sin(2*pi/3),-Math.sin(2*pi/3),Math.cos(2*pi/3)},//ab
{-Math.cos(4*pi/3),-Math.sin(4*pi/3),-Math.sin(4*pi/3),Math.cos(4*pi/3)},//a^2b
{Math.cos(4*pi/3),-Math.sin(4*pi/3),Math.sin(4*pi/3),Math.cos(4*pi/3)},//a^2
{Math.cos(2*pi/3),-Math.sin(2*pi/3),Math.sin(2*pi/3),Math.cos(2*pi/3)},//a
};
int n=arr.length;
m_Set=new DM2[n];
for(int i=0;i<n;i++){
m_Set[i]=DM2.create(arr[i][0],arr[i][1],arr[i][2],arr[i][3]);
//System.out.printf("%f,%f,%f,%f\n",arr[i][0],arr[i][1],arr[i][2],arr[i][3]);
}
}
/*
public void initTable(){
int n=size();
m_Mul=new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
DM2 t=m_Set[i];
DM2 m=m_Set[j];
DM2 tm=DM2.Mul(t,m);
int ij=getidx(m_Set,tm);
m_Mul[i][j]=ij;
}
}
}
*/
public static void main (String args[])
{
GL2R d3 = new GL2R();
d3.initD3();
d3.printSet();
d3.printTable();
}
}