init.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. /**
  2. * This file is part of Gomu.
  3. *
  4. * Copyright 2016 by Jean Fromentin <jean.fromentin@math.cnrs.fr>
  5. *
  6. * Gomu is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Gomu is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with Gomu. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include "init.hpp"
  20. //******************
  21. //* Global objects *
  22. //******************
  23. Gomu::Type* type_ArtinWordA;
  24. Gomu::Type* type_DualWordA;
  25. Gomu::Type* type_monoid_family;
  26. Gomu::Type* type_word;
  27. //*************************
  28. //* Extension inilisation *
  29. //*************************
  30. extern "C"{
  31. Word empty_word;
  32. Word x1({1});
  33. Word x2({2});
  34. Word x3({3});
  35. Word x4({4});
  36. Word X1({-1});
  37. Word X2({-2});
  38. Word X3({-3});
  39. Word X4({-4});
  40. Word x12({generator(1,2)});
  41. Word x13({generator(1,3)});
  42. Word x23({generator(2,3)});
  43. Word x14({generator(1,4)});
  44. Word x24({generator(2,4)});
  45. Word x34({generator(3,4)});
  46. Word x15({generator(1,5)});
  47. Word x25({generator(2,5)});
  48. Word x35({generator(3,5)});
  49. Word x45({generator(4,5)});
  50. Word X12({(Generator)(-generator(1,2))});
  51. Word X13({(Generator)(-generator(1,3))});
  52. Word X23({(Generator)(-generator(2,3))});
  53. Word X14({(Generator)(-generator(1,4))});
  54. Word X24({(Generator)(-generator(2,4))});
  55. Word X34({(Generator)(-generator(3,4))});
  56. Word X15({(Generator)(-generator(1,5))});
  57. Word X25({(Generator)(-generator(2,5))});
  58. Word X35({(Generator)(-generator(3,5))});
  59. Word X45({(Generator)(-generator(4,5))});
  60. void init(){
  61. braids_init();
  62. }
  63. Gomu::Module::Type types[]={
  64. {"ArtinWordA",ArtinWordA_display,word_delete,word_copy,word_compare,&type_ArtinWordA},
  65. {"DualWordA",DualWordA_display,word_delete,word_copy,word_compare,&type_DualWordA},
  66. {"ArtinMonoidFamilyA",mf_display,mf_delete,Gomu::no_copy,Gomu::no_comp,&type_monoid_family},
  67. {"DualMonoidFamilyA",mf_display,mf_delete,Gomu::no_copy,Gomu::no_comp,&type_monoid_family},
  68. {"MonoidFamily",mf_display,mf_delete,Gomu::no_copy,Gomu::no_comp,&type_monoid_family},
  69. {"Word",word_display,word_delete,word_copy,word_compare,&type_word},
  70. TYPE_SENTINEL
  71. };
  72. Gomu::Module::Function functions[]={
  73. {"ArtinWordA","operator*",{"ArtinWordA","ArtinWordA"},(void*)word_concatenate},
  74. {"DualWordA","operator*",{"DualWordA","DualWordA"},(void*)word_concatenate},
  75. {"Word","word",{"Array"},(void*)word_from_array},
  76. FUNC_SENTINEL
  77. };
  78. Gomu::Module::Function member_functions[]={
  79. //ArtinMonoidFamilyA
  80. {"ArtinWordA","garside_element",{"ArtinMonoidFamilyA","Integer"},(void*)mt_garside_element},
  81. {"Boolean","is_left_divisible",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_is_left_divisible},
  82. {"Tuple","is_left_divisible_x",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_is_left_divisible_x},
  83. {"Boolean","is_right_divisible",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_is_right_divisible},
  84. {"Tuple","is_right_divisible_x",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_is_right_divisible_x},
  85. {"ArtinWordA","left_complement",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_left_complement},
  86. {"ArtinWordA","left_denominator",{"ArtinMonoidFamilyA"},(void*)mt_left_denominator},
  87. {"ArtinWordA","left_lcm",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_left_lcm},
  88. {"ArtinWordA","left_lcm_complement",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_left_lcm_complement},
  89. {"ArtinWordA","left_gcd",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_left_gcd},
  90. {"Tuple","left_gcd_x",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_left_gcd_x},
  91. {"ArtinWordA","left_numerator",{"ArtinMonoidFamilyA"},(void*)mt_left_numerator},
  92. {"ArtinWordA","left_reverse",{"ArtinMonoidFamilyA","ArtinWordA"},(void*)mt_left_reverse},
  93. {"ArtinWordA","left_reverse",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_left_reverse2},
  94. {"ArtinWordA","phi",{"ArtinMonoidFamilyA","Integer","ArtinWordA"},(void*)mt_phi},
  95. {"ArtinWordA","phi",{"ArtinMonoidFamilyA","Integer","ArtinWordA","Integer"},(void*)mt_phi_power},
  96. {"ArtinWordA","right_complement",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_right_complement},
  97. {"ArtinWordA","right_denominator",{"ArtinMonoidFamilyA"},(void*)mt_right_denominator},
  98. {"ArtinWordA","right_lcm",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_right_lcm},
  99. {"ArtinWordA","right_lcm_complement",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_right_lcm_complement},
  100. {"ArtinWordA","right_gcd",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_right_gcd},
  101. {"Tuple","right_gcd_x",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_right_gcd_x},
  102. {"ArtinWordA","right_numerator",{"ArtinMonoidFamilyA"},(void*)mt_right_numerator},
  103. {"ArtinWordA","right_reverse",{"ArtinMonoidFamilyA","ArtinWordA"},(void*)mt_right_reverse},
  104. {"ArtinWordA","right_reverse",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_right_reverse2},
  105. //ArtinWordA
  106. {"Integer","length",{"ArtinWordA"},(void*)word_length},
  107. {"ArtinWordA","inverse",{"ArtinWordA"},(void*)word_inverse},
  108. //DualMonoidFamilyA
  109. {"DualWordA","garside_element",{"DualMonoidFamilyA","Integer"},(void*)mt_garside_element},
  110. {"Boolean","is_left_divisible",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_is_left_divisible},
  111. {"Tuple","is_left_divisible_x",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_is_left_divisible_x},
  112. {"Boolean","is_right_divisible",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_is_right_divisible},
  113. {"Tuple","is_right_divisible_x",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_is_right_divisible_x},
  114. {"DualWordA","left_complement",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_complement},
  115. {"DualWordA","left_denominator",{"DualMonoidFamilyA"},(void*)mt_left_denominator},
  116. {"DualWordA","left_lcm",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_lcm},
  117. {"DualWordA","left_lcm_complement",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_lcm_complement},
  118. {"DualWordA","left_gcd",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_gcd},
  119. {"Tuple","left_gcd_x",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_gcd_x},
  120. {"DualWordA","left_numerator",{"DualMonoidFamilyA"},(void*)mt_left_numerator},
  121. {"DualWordA","left_reverse",{"DualMonoidFamilyA","DualWordA"},(void*)mt_left_reverse},
  122. {"DualWordA","left_reverse",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_reverse2},
  123. {"DualWordA","phi",{"DualMonoidFamilyA","Integer","DualWordA"},(void*)mt_phi},
  124. {"DualWordA","phi",{"DualMonoidFamilyA","Integer","DualWordA","Integer"},(void*)mt_phi_power},
  125. {"DualWordA","right_complement",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_complement},
  126. {"DualWordA","right_denominator",{"DualMonoidFamilyA"},(void*)mt_right_denominator},
  127. {"DualWordA","right_lcm",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_lcm},
  128. {"DualWordA","right_lcm_complement",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_lcm_complement},
  129. {"DualWordA","right_gcd",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_gcd},
  130. {"Tuple","right_gcd_x",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_gcd_x},
  131. {"DualWordA","right_numerator",{"DualMonoidFamilyA"},(void*)mt_right_numerator},
  132. {"DualWordA","right_reverse",{"DualMonoidFamilyA","DualWordA"},(void*)mt_right_reverse},
  133. {"DualWordA","right_reverse",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_reverse2},
  134. //DualWordA
  135. {"Integer","length",{"DualWordA"},(void*)word_length},
  136. {"ArtinWordA","inverse",{"DualWordA"},(void*)word_inverse},
  137. //MonoidFamily
  138. {"Integer","generators_number",{"MonoidFamily","Integer"},(void*)mf_generators_number},
  139. //Word
  140. {"Integer","length",{"Word"},(void*)word_length},
  141. {"Word","inverse",{"Word"},(void*)word_inverse},
  142. FUNC_SENTINEL
  143. };
  144. Gomu::Module::Symbol symbols[]={
  145. {"a0","ArtinWordA",(void*)&empty_word},
  146. {"a1","ArtinWordA",(void*)&x1},
  147. {"a2","ArtinWordA",(void*)&x2},
  148. {"a3","ArtinWordA",(void*)&x3},
  149. {"a4","ArtinWordA",(void*)&x4},
  150. {"A1","ArtinWordA",(void*)&X1},
  151. {"A2","ArtinWordA",(void*)&X2},
  152. {"A3","ArtinWordA",(void*)&X3},
  153. {"A4","ArtinWordA",(void*)&X4},
  154. {"a00","DualWordA",(void*)&empty_word},
  155. {"a12","DualWordA",(void*)&x12},
  156. {"a13","DualWordA",(void*)&x13},
  157. {"a23","DualWordA",(void*)&x23},
  158. {"a14","DualWordA",(void*)&x14},
  159. {"a24","DualWordA",(void*)&x24},
  160. {"a34","DualWordA",(void*)&x34},
  161. {"a15","DualWordA",(void*)&x15},
  162. {"a25","DualWordA",(void*)&x25},
  163. {"a35","DualWordA",(void*)&x35},
  164. {"a45","DualWordA",(void*)&x45},
  165. {"A12","DualWordA",(void*)&X12},
  166. {"A13","DualWordA",(void*)&X13},
  167. {"A23","DualWordA",(void*)&X23},
  168. {"A14","DualWordA",(void*)&X14},
  169. {"A24","DualWordA",(void*)&X24},
  170. {"A34","DualWordA",(void*)&X34},
  171. {"A15","DualWordA",(void*)&X15},
  172. {"A25","DualWordA",(void*)&X25},
  173. {"A35","DualWordA",(void*)&X35},
  174. {"A45","DualWordA",(void*)&X45},
  175. {"ArtinA","ArtinMonoidFamilyA",(void*)&ArtinA_mf},
  176. {"DualA","DualMonoidFamilyA",(void*)&DualA_mf},
  177. SYMB_SENTINEL
  178. };
  179. };
  180. //*************************
  181. //* Fonctions definitions *
  182. //*************************
  183. //-------------------------------------------
  184. // Word garside_element(MonoidTrait,Integer)
  185. //-------------------------------------------
  186. void* mt_garside_element(void* m,void* r){
  187. MonoidTrait* monoid=(MonoidTrait*)m;
  188. if(not monoid->has_garside_element())
  189. RuntimeError("Monoid doesn't have Garside element");
  190. return (void*)(new Word(monoid->garside_element(Gomu::get_slong(r))));
  191. }
  192. //--------------------------------------------------
  193. // Boolean is_left_divisible(MonoidTrait,Word,Word)
  194. //--------------------------------------------------
  195. void* mt_is_left_divisible(void* m,void* a,void* b){
  196. MonoidTrait* monoid=(MonoidTrait*)m;
  197. return Gomu::to_boolean(monoid->is_left_divisible(*(Word*)a,*(Word*)b));
  198. }
  199. //---------------------------------------------------------------
  200. // pair<Boolean,Word> is_left_divisible_x(MonoidTrait,Word,Word)
  201. //---------------------------------------------------------------
  202. void* mt_is_left_divisible_x(void* m,void* a,void* b){
  203. MonoidTrait* monoid=(MonoidTrait*)m;
  204. pair<bool,Word> p=monoid->is_left_divisible_x(*(Word*)a,*(Word*)b);
  205. Gomu::TupleValue* res=new Gomu::TupleValue(2);
  206. res->tab[0]=Gomu::Value(Gomu::type_boolean,Gomu::to_boolean(p.first));
  207. res->tab[1]=Gomu::Value((Gomu::Type*)monoid->data,new Word(p.second));
  208. return (void*)res;
  209. }
  210. //-----------------------------------------------
  211. // bool is_right_divisible(MonoidTrait,Word,Word)
  212. //-----------------------------------------------
  213. void* mt_is_right_divisible(void* m,void* a,void* b){
  214. MonoidTrait* monoid=(MonoidTrait*)m;
  215. return Gomu::to_boolean(monoid->is_right_divisible(*(Word*)a,*(Word*)b));
  216. }
  217. //----------------------------------------------------------------
  218. // pair<Boolean,Word> is_right_divisible_x(MonoidTrait,Word,Word)
  219. //----------------------------------------------------------------
  220. void* mt_is_right_divisible_x(void* m,void* a,void* b){
  221. MonoidTrait* monoid=(MonoidTrait*)m;
  222. pair<bool,Word> p=monoid->is_right_divisible_x(*(Word*)a,*(Word*)b);
  223. Gomu::TupleValue* res=new Gomu::TupleValue(2);
  224. res->tab[0]=Gomu::Value(Gomu::type_boolean,Gomu::to_boolean(p.first));
  225. res->tab[1]=Gomu::Value((Gomu::Type*)monoid->data,new Word(p.second));
  226. return (void*)res;
  227. }
  228. //---------------------------------------------
  229. // Word left_complement(MonoidTrait,Word,Word)
  230. //---------------------------------------------
  231. void* mt_left_complement(void* m,void* a,void* b){
  232. MonoidTrait* monoid=(MonoidTrait*)m;
  233. Word* u=(Word*)a;
  234. Word* v=(Word*)b;
  235. if(u->size()!=1 or v->size()!=1) RuntimeError("Words must be of length 1");
  236. return new Word(monoid->left_complement(u->array[0],v->array[0]));
  237. }
  238. //------------------------------------
  239. // Word left_denominator(MonoidTrait)
  240. //------------------------------------
  241. void* mt_left_denominator(void* m){
  242. MonoidTrait* monoid=(MonoidTrait*)m;
  243. if(not monoid->has_left_complement())
  244. RuntimeError("Monoid is not left complemented");
  245. return new Word(monoid->left_denominator());
  246. }
  247. //---------------------------------------
  248. // Word left_gcd(MonoidTrait,Word,Word)
  249. //---------------------------------------
  250. void* mt_left_gcd(void* m,void* a,void *b){
  251. MonoidTrait* monoid=(MonoidTrait*)m;
  252. return new Word(monoid->left_gcd(*(Word*)a,*(Word*)b));
  253. }
  254. //-----------------------------------------------
  255. // (Word,Word) left_gcd_x(MonoidTrait,Word,Word)
  256. //-----------------------------------------------
  257. void* mt_left_gcd_x(void* m,void* a,void *b){
  258. MonoidTrait* monoid=(MonoidTrait*)m;
  259. pair<Word,Word> p=monoid->left_gcd_x(*(Word*)a,*(Word*)b);
  260. Gomu::TupleValue* res=new Gomu::TupleValue(2);
  261. Gomu::Type* type=(Gomu::Type*)monoid->data;
  262. res->tab[0]=Gomu::Value(type,new Word(p.first));
  263. res->tab[1]=Gomu::Value(type,new Word(p.second));
  264. return (void*)res;
  265. }
  266. //--------------------------------------
  267. // Word left_lcm(MonoidTrait,Word,Word)
  268. //--------------------------------------
  269. void* mt_left_lcm(void* m,void* a,void *b){
  270. MonoidTrait* monoid=(MonoidTrait*)m;
  271. return new Word(monoid->left_lcm(*(Word*)a,*(Word*)b));
  272. }
  273. //-------------------------------------------------
  274. // Word left_lcm_complement(MonoidTrait,Word,Word)
  275. //-------------------------------------------------
  276. void* mt_left_lcm_complement(void* m,void* a,void *b){
  277. MonoidTrait* monoid=(MonoidTrait*)m;
  278. return new Word(monoid->left_lcm_complement(*(Word*)a,*(Word*)b));
  279. }
  280. //----------------------------------
  281. // Word left_numerator(MonoidTrait)
  282. //----------------------------------
  283. void* mt_left_numerator(void* m){
  284. MonoidTrait* monoid=(MonoidTrait*)m;
  285. if(not monoid->has_left_complement())
  286. RuntimeError("Monoid is not left complemented");
  287. return new Word(monoid->left_numerator());
  288. }
  289. //-------------------------------------
  290. // Word left_reverse(MonoidTrait,Word)
  291. //-------------------------------------
  292. void* mt_left_reverse(void* m,void* w){
  293. MonoidTrait* monoid=(MonoidTrait*)m;
  294. if(not monoid->has_left_complement())
  295. RuntimeError("Monoid is not left complemented");
  296. return (void*)new Word(monoid->left_reverse(*(Word*)w));
  297. }
  298. //------------------------------------------
  299. // Word left_reverse(MonoidTrait,Word,Word)
  300. //------------------------------------------
  301. void* mt_left_reverse2(void* m,void* num,void* den){
  302. MonoidTrait* monoid=(MonoidTrait*)m;
  303. if(not monoid->has_left_complement())
  304. RuntimeError("Monoid is not left complemented");
  305. return (void*)new Word(monoid->left_reverse(*(Word*)num,*(Word*)den));
  306. }
  307. //------------------------------------
  308. // Word phi(MonoidTrait,Integer,Word)
  309. //------------------------------------
  310. void* mt_phi(void* m,void* r,void* w){
  311. MonoidTrait* monoid=(MonoidTrait*)m;
  312. if(not monoid->has_garside_automorphism())
  313. RuntimeError("Monoid has not Garside automorphism");
  314. size_t rank=Gomu::get_slong(r);
  315. return new Word(monoid->phi(rank,*(Word*)w));
  316. }
  317. //--------------------------------------------
  318. // Word phi(MonoidTrait,Integer,Word,Integer)
  319. //--------------------------------------------
  320. void* mt_phi_power(void* m,void* r,void* w,void* p){
  321. MonoidTrait* monoid=(MonoidTrait*)m;
  322. if(not monoid->has_garside_automorphism())
  323. RuntimeError("Monoid has not Garside automorphism");
  324. size_t rank=Gomu::get_slong(r);
  325. int power=Gomu::get_slong(p);
  326. return new Word(monoid->phi(rank,*(Word*)w,power));
  327. }
  328. //----------------------------------------------
  329. // Word right_complement(MonoidTrait,Word,Word)
  330. //----------------------------------------------
  331. void* mt_right_complement(void* m,void* a,void* b){
  332. MonoidTrait* monoid=(MonoidTrait*)m;
  333. Word* u=(Word*)a;
  334. Word* v=(Word*)b;
  335. if(u->size()!=1 or v->size()!=1) RuntimeError("Words must be of length 1");
  336. return new Word(monoid->right_complement(u->array[0],v->array[0]));
  337. }
  338. //-------------------------------------
  339. // Word right_denominator(MonoidTrait)
  340. //-------------------------------------
  341. void* mt_right_denominator(void* m){
  342. MonoidTrait* monoid=(MonoidTrait*)m;
  343. if(not monoid->has_right_complement())
  344. RuntimeError("Monoid is not right complemented");
  345. return new Word(monoid->right_denominator());
  346. }
  347. //---------------------------------------
  348. // Word right_gcd(MonoidTrait,Word,Word)
  349. //---------------------------------------
  350. void* mt_right_gcd(void* m,void* a,void *b){
  351. MonoidTrait* monoid=(MonoidTrait*)m;
  352. return new Word(monoid->right_gcd(*(Word*)a,*(Word*)b));
  353. }
  354. //-----------------------------------------------
  355. // (Word,Word) right_gcd_x(MonoidTrait,Word,Word)
  356. //-----------------------------------------------
  357. void* mt_right_gcd_x(void* m,void* a,void *b){
  358. MonoidTrait* monoid=(MonoidTrait*)m;
  359. pair<Word,Word> p=monoid->right_gcd_x(*(Word*)a,*(Word*)b);
  360. Gomu::TupleValue* res=new Gomu::TupleValue(2);
  361. Gomu::Type* type=(Gomu::Type*)monoid->data;
  362. res->tab[0]=Gomu::Value(type,new Word(p.first));
  363. res->tab[1]=Gomu::Value(type,new Word(p.second));
  364. return (void*)res;
  365. }
  366. //---------------------------------------
  367. // Word right_lcm(MonoidTrait,Word,Word)
  368. //---------------------------------------
  369. void* mt_right_lcm(void* m,void* a,void *b){
  370. MonoidTrait* monoid=(MonoidTrait*)m;
  371. return new Word(monoid->right_lcm(*(Word*)a,*(Word*)b));
  372. }
  373. //--------------------------------------------------
  374. // Word right_lcm_complement(MonoidTrait,Word,Word)
  375. //--------------------------------------------------
  376. void* mt_right_lcm_complement(void* m,void* a,void *b){
  377. MonoidTrait* monoid=(MonoidTrait*)m;
  378. return new Word(monoid->right_lcm_complement(*(Word*)a,*(Word*)b));
  379. }
  380. //-----------------------------------
  381. // Word right_numerator(MonoidTrait)
  382. //-----------------------------------
  383. void* mt_right_numerator(void* m){
  384. MonoidTrait* monoid=(MonoidTrait*)m;
  385. if(not monoid->has_right_complement())
  386. RuntimeError("Monoid is not right complemented");
  387. return new Word(monoid->right_numerator());
  388. }
  389. //--------------------------------------
  390. // Word right_reverse(MonoidTrait,Word)
  391. //--------------------------------------
  392. void* mt_right_reverse(void* m,void* w){
  393. MonoidTrait* monoid=(MonoidTrait*)m;
  394. if(not monoid->has_right_complement())
  395. RuntimeError("Monoid is not right complemented");
  396. return (void*)new Word(monoid->right_reverse(*(Word*)w));
  397. }
  398. //-------------------------------------------
  399. // Word right_reverse(MonoidTrair,Word,Word)
  400. //-------------------------------------------
  401. void* mt_right_reverse2(void* m,void* den,void* num){
  402. MonoidTrait* monoid=(MonoidTrait*)m;
  403. if(not monoid->has_right_complement())
  404. RuntimeError("Monoid is not right complemented");
  405. return (void*)new Word(monoid->right_reverse(*(Word*)den,*(Word*)num));
  406. }
  407. //-----------------------
  408. // Word word(ArrayValue)
  409. //-----------------------
  410. void* word_from_array(void* arr){
  411. Gomu::ArrayValue* array=(Gomu::ArrayValue*)arr;
  412. if(array->type!=Gomu::type_integer)
  413. RuntimeError("An array of integer is needed");
  414. size_t size=array->size;
  415. Word* res=new Word(size);
  416. for(size_t i=0;i<size;++i){
  417. res->write(i,Gomu::get_slong(array->tab[i]));
  418. }
  419. return res;
  420. }