semigroup.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include <iostream>
  2. #include <cstring>
  3. #include "semigroup.hpp"
  4. Semigroup::Semigroup(const Semigroup& S){
  5. for(auto i=0;i<NBLOCKS;++i){
  6. blocks[i]=S.blocks[i];
  7. }
  8. conductor=S.conductor;
  9. min=S.min;
  10. genus=S.genus;
  11. left_primitive=S.left_primitive;
  12. left=S.left;
  13. e=S.e;
  14. wilf=S.wilf;
  15. }
  16. Semigroup& Semigroup::operator=(const Semigroup& S){
  17. for(auto i=0;i<NBLOCKS;++i){
  18. blocks[i]=S.blocks[i];
  19. }
  20. conductor=S.conductor;
  21. min=S.min;
  22. genus=S.genus;
  23. left_primitive=S.left_primitive;
  24. left=S.left;
  25. e=S.e;
  26. wilf=S.wilf;
  27. }
  28. void init_full_N(Semigroup &m){
  29. epi8 block ={1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8};
  30. for(auto i=0; i<NBLOCKS; i++){
  31. m.blocks[i] = block;
  32. block = block + 8;
  33. }
  34. m.genus = 0;
  35. m.conductor = 1;
  36. m.min = 1;
  37. m.left=1;
  38. m.left_primitive=0;
  39. m.e=1;
  40. m.wilf=0;
  41. }
  42. void init(Semigroup& S,char c,char g,char m,char* d){
  43. S.conductor=c;
  44. S.genus=g;
  45. S.min=m;
  46. memcpy((void*)S.decs,(void*)d,(3*MAX_GENUS+1));
  47. S.left=0;
  48. S.left_primitive=0;
  49. S.e=0;
  50. for(ind_t i=0;i<S.conductor;++i){
  51. if(d[i]>0){
  52. ++S.left;
  53. if(d[i]==1){
  54. ++S.e;
  55. ++S.left_primitive;
  56. }
  57. }
  58. }
  59. for(ind_t i=S.conductor;i<S.conductor+S.min;++i){
  60. if(d[i]==1){
  61. ++S.e;
  62. }
  63. }
  64. S.wilf=S.left*S.e-S.conductor;
  65. }
  66. void init_ordinary(Semigroup &O,int m){
  67. O.decs[0]=1;
  68. for(auto i=1;i<2*m;++i){
  69. O.decs[i]=i/m;
  70. }
  71. for(auto i=0;i<SIZE-2*m;++i){
  72. O.decs[2*m+i]=2+i/2;
  73. }
  74. O.genus = m-1;
  75. O.conductor = m;
  76. O.min = m;
  77. O.left=1;
  78. O.left_primitive=0;
  79. O.e=m;
  80. O.wilf=0;
  81. }
  82. void print_Semigroup(const Semigroup &m)
  83. {
  84. unsigned int i;
  85. std::cout<<"min = "<<m.min<<", cond = "<<m.conductor<<", genus = "<<m.genus<<", decs = ";
  86. for (i=0; i<SIZE; i++) std::cout<<((int) m.decs[i])<<' ';
  87. std::cout<<std::endl;
  88. }
  89. void print_Semigroup_gen(const Semigroup &m)
  90. {
  91. unsigned int i;
  92. std::cout<<"m = "<<m.min<<", c = "<<m.conductor<<", g = "<<m.genus<<" w = "<<m.wilf<<" ";
  93. std::cout<<"< ";
  94. for (i=1; i<SIZE; i++){
  95. if(m.decs[i]==1){
  96. std::cout<<i<<' ';
  97. }
  98. }
  99. std::cout<<'>'<<std::endl;
  100. }
  101. #include <cmath>
  102. void output(const Semigroup& m,fstream& f){
  103. int q=ceil(float(m.conductor)/float(m.min));
  104. int rho=q*m.min-m.conductor;
  105. f<<"c = "<<m.conductor<<", g = "<<m.genus<<", r = "<<rho<<", w = "<<m.wilf<<" : ["<<m.min;
  106. for (auto i=m.min+1; i<SIZE; i++){
  107. if(m.decs[i]==1){
  108. f<<','<<i;
  109. }
  110. }
  111. f<<']'<<endl;
  112. }
  113. void record(const Semigroup& S,fstream& f){
  114. char c,g,m;
  115. c=S.conductor;
  116. g=S.genus;
  117. m=S.min;
  118. f.write(&c,1);
  119. f.write(&g,1);
  120. f.write(&m,1);
  121. f.write((char*)(&S.decs),3*MAX_GENUS+1);
  122. }
  123. void print_epi8(epi8 bl)
  124. {
  125. unsigned int i;
  126. for (i=0; i<16; i++) std::cout<<((uint8_t*)&bl)[i]<<' ';
  127. std::cout<<std::endl;
  128. }