Closed saraedum closed 2 years ago
Why is it so expensive to invert and multiply 2x2 matrices?
Also, we generally do not care about the complete list of symmetries, only about it as a group (e.g. having a small set of generators is more valuable).
Why is it so expensive to invert and multiply 2x2 matrices?
I don't know. These are matrices with pyeantic coefficients number field coefficients.
Also, we generally do not care about the complete list of symmetries, only about it as a group (e.g. having a small set of generators is more valuable).
True. At the moment, I am just using this in flatsurvey to check that the chosen directions actually generate S¹(2d')
. At the moment, I just want this as a dumb and cheap assert to make sure we're not doing anything wrong. I would not propose to implement it like this in sage-flatsurf. For flatsurvey, it's fine I think.
I'll look into why the matrix operations are so slow…
My benchmark is the (1, 13, 63) triangle. In that case, the worst combination are the following matrices which take 5ms (4ms for the inverse, 1ms for the multiplication; computing a/b instead of a*~b is even slower.)
sage: a
[ 1/2*c^32 - 16*c^30 + 232*c^28 - 2016*c^26 + 11700*c^24 - 47840*c^22 + 141680*c^20 - 307648*c^18 + 490314*c^16 - 568480*c^14 + 470288*c^12 - 268736*c^10 + 100776*c^8 - 22848*c^6 + 2720*c^4 - 128*c^2 + 1 1/2*c^45 - 45/2*c^43 + 945/2*c^41 - 6150*c^39 + 55575*c^37 - 740259/2*c^35 + 3764565/2*c^33 - 7472520*c^31 + 23477850*c^29 - 58839550*c^27 + 118015326*c^25 - 189329400*c^23 + 241920900*c^21 - 488494125/2*c^19 + 384942375/2*c^17 - 116338140*c^15 + 105306075/2*c^13 - 34512075/2*c^11 + 7811375/2*c^9 - 569250*c^7 + 47817*c^5 - 3795/2*c^3 + 45/2*c]
[-1/2*c^45 + 45/2*c^43 - 945/2*c^41 + 6150*c^39 - 55575*c^37 + 740259/2*c^35 - 3764565/2*c^33 + 7472520*c^31 - 23477850*c^29 + 58839550*c^27 - 118015326*c^25 + 189329400*c^23 - 241920900*c^21 + 488494125/2*c^19 - 384942375/2*c^17 + 116338140*c^15 - 105306075/2*c^13 + 34512075/2*c^11 - 7811375/2*c^9 + 569250*c^7 - 47817*c^5 + 3795/2*c^3 - 45/2*c 1/2*c^32 - 16*c^30 + 232*c^28 - 2016*c^26 + 11700*c^24 - 47840*c^22 + 141680*c^20 - 307648*c^18 + 490314*c^16 - 568480*c^14 + 470288*c^12 - 268736*c^10 + 100776*c^8 - 22848*c^6 + 2720*c^4 - 128*c^2 + 1]
sage: b
[1/2*c^56 - 28*c^54 + 742*c^52 - 12376*c^50 + 291549/2*c^48 - 1289656*c^46 + 8898252*c^44 - 98156961/2*c^42 + 220046221*c^40 - 1622508211/2*c^38 + 2478263737*c^36 - 12605605553/2*c^34 + 13375415346*c^32 - 23688023924*c^30 + 69889655249/2*c^28 - 85547275767/2*c^26 + 86359976559/2*c^24 - 35647530996*c^22 + 47592894945/2*c^20 - 25312575713/2*c^18 + 10521076245/2*c^16 - 1665946629*c^14 + 388536317*c^12 - 127342359/2*c^10 + 6849711*c^8 - 435039*c^6 + 13450*c^4 - 120*c^2 - 1/2 1/2*c^15 - 15/2*c^13 + 45*c^11 - 275/2*c^9 + 225*c^7 - 189*c^5 + 70*c^3 - 15/2*c]
[ -1/2*c^15 + 15/2*c^13 - 45*c^11 + 275/2*c^9 - 225*c^7 + 189*c^5 - 70*c^3 + 15/2*c 1/2*c^56 - 28*c^54 + 742*c^52 - 12376*c^50 + 291549/2*c^48 - 1289656*c^46 + 8898252*c^44 - 98156961/2*c^42 + 220046221*c^40 - 1622508211/2*c^38 + 2478263737*c^36 - 12605605553/2*c^34 + 13375415346*c^32 - 23688023924*c^30 + 69889655249/2*c^28 - 85547275767/2*c^26 + 86359976559/2*c^24 - 35647530996*c^22 + 47592894945/2*c^20 - 25312575713/2*c^18 + 10521076245/2*c^16 - 1665946629*c^14 + 388536317*c^12 - 127342359/2*c^10 + 6849711*c^8 - 435039*c^6 + 13450*c^4 - 120*c^2 - 1/2]
sage: a.base_ring()
Number Field in c with defining polynomial x^60 - 59*x^58 + 1652*x^56 - 29205*x^54 + 365859*x^52 - 3455335*x^50 + 25556440*x^48 - 151794021*x^46 + 736647495*x^44 - 2956412711*x^42 + 9894941476*x^40 - 27773378270*x^38 + 65592924343*x^36 - 130530017729*x^34 + 218801812945*x^32 - 308337579027*x^30 + 363972489209*x^28 - 357976286928*x^26 + 291226209171*x^24 - 194130948828*x^22 + 104766369144*x^20 - 45083463663*x^18 + 15176439088*x^16 - 3900841911*x^14 + 742221909*x^12 - 100422335*x^10 + 9156888*x^8 - 521938*x^6 + 16580*x^4 - 240*x^2 + 1 with c = 1.999583856378413?
Or more conveniently,
sage: dumps((a, b))
b'x\x9c\x9d\x98\x05\x98\x13\xd7\xd7\xc6!\xbbX\xa0\xd0\x16\xeaF}i\xbb\x90l6V\x85b\x05\xca\x96^\xa0\xdd\nM#\x93d6zn&\x01\xdaR\xa8d\x17\xea\xd4\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xbd\xff;\xefL\xce\xccn\xe1\xfb\xfe\xdf\xf7\xf0<a\xde\xbc\xbfs\xee\x9d\xb9w\xce\xb9\xd9%\x9ed%\x9e\xd1\xc6\x16\xe2\x86\xd4\x17\xd8\xff\xf9\xbc\xd5bYO\xe6\xf2\x9a\x97\xfa\xb5\xac\x00\x88e\xb4\xa2&\xf5d,\xa5\x15+\x9aw\xe6\x8a\xbe\xa4\xfeV`\xc5\x90\xd5\xa4Q\x95\xda\xd8jQ\xa7\xaa\x16\x93ZYj\x15\xadh\xc4\r\xbdTTCI-UM\xaa\x80\x15M%V)\xc7\x93\x8d\x11f\xe3\x9a\x9aZ\xfafN\xc7\x93FI.\xf46f`\xeb\x98s\x1b\xcd+\x8d\xc9\x97J\xb9j9\x96\xc9\x97\x12\xf1\xbc\x97\x06tF\xfb\xf5\xeb\x07V\xea\xc5Lel\xb1ZHh2\x96\xd6\xb5|\xaa\xb7\xe8\x80\x98b^\xc7j\x9a\xac\xa8\xbbi\xa3\x81u\x1a$h\xf0\x8c!3\x06t\xd3\x10{T+\x93\xc4\r\xc7\xf3V\xb8W\xd8\x12\t\xbc\xe4\x1d#h\xa8\x1b/\x97\xf2\x0b\x8b\xa5\x82\x1e\xcf\xbb.cN\x92\xbc^4\xbc\xb3V\xea\xd0\xb0\x96\xff"\x9b\xf2b\xc9R\xd1z,%\xc9\x0b\x1fs\x12\x0b\xc5xi\x95\x96\xec\xd0\xce\xfe\xea\xd1,\xa0\xe1u\x1a\xd1\xb1\xcc\xa0U\x05\xad6\x8fV_\xe1=z\x0b\xf1\x9c\xc6S\xf2\xd2H\xc4\xfaiT\x9d\xd6\x10\xb4f\xd6\xd2>Z\xabNk\x0bZG\xe9&\xa5[\xc3\x19Z\xb7N\xeb\tZ?;2\xab\xbc\r\x04mh{\x99P;mT\xa7\xd1\x826\xb6\xbcM\x04m\xaa\xbc\x01f\\\xda(\xe8\xb4Y\x9d6\x17\xb4\x85\xe5n)\xa8\xc5v#E-R\xa21u\xdaJ\xd0\xd6\x96\xbb\x8d\xa0V\xe5\x0e2c\xdbj\xa5\\\xbeFc\xeb4N\x90\xcf\xf2\xfd\x82\xda\x94?P\xf9\x85\x00Q[\x9e\x02uj\x17\x14\xb4\xec\x90\xa0\xb0\xb2\x07\x9b\xe1\x81\\\xa4=l\x14)R\xa7\xa8\xa0m-`;A\xdb\xdb\xf9\xb5\xf6h2\x18\xcd\xd0\x0eu\xdaQ\xd0N\x96?^\xd0\x04\xe5\x0f1\x13\xf8\xa35\xbd\x1a\xa8\xa5i\xe7:M\x144\xc9"&\x0b\x9ab\x0f\x11\xf0\xeb\x91\x9aL\x94hj\x9dv\x114\xcd\x02\xa6\x0b\x9a\xd1H\x11\xcc\x95\xb3\x85d\xa1B\xbb\xd6i\xa6\xa0\x0e\x8b\xd8M\xd0,;E$\x1d\x0eU\xf5J\x17\xed^\'!h\xb6\x05\xcc\x114\xb7\x91"\x9eJf\xca\xd1B\x86\xf6\xa8\xd3\x9e\x82:-b/A{\xdb)\xe2z-\x1c\x92\xb52\xedS\xa7}\x05\xcd\xb3\x80\xfd\x04\xc5\x1a)"\xb5`0\x17\xf4u\xd1\xfeu\x8a\x0bJXDRP\xcaN\x11J\x94\xca\xf9\x94\x96%\xadNiA\x19\x0b\xc8\n\xd2\x1b)\x02e=\xd0\xee\xd3\xfc\xd4U\xa7\x9c\xa0\xbcE\x14\x04\x15\xed\x14~\xa3\x8d\xa2\xa1`\x91Ju*\x0b"\x0b\x90\x82*\x8d\xf5(\xcbB)\\\xa8\x92Q\xa7\xaa\xa0\x9a\x05\xcc\x17\xb4\xc0^\x8fh\xa8\x92\xcd\x95\xdbia\x9d\x0e\x10t\xa0\xe5\x1f$hQ#A[)\xa0e\xcba:\xb8N\x8b\x05-\xb1\x80C\x04\x1djo\x88|5S\x88\x87\xe9\xb0:\x1d.\xa8n\xd9\xdd\x82z\x1a\xfb\xa9=SJ&\x82\xb4\xb4N\xcb\x04\x1da\xf9G\n:\xca\xde\x8d\xa5\x84\xa1\x95\xe8\xe8:\x1d#\xe8X\xcb=N\xd0r;yk \xaa%\xc2t|\x9dN\x10t\xa2e\x9f$\xe8de7+;\x11\x8c\x06\xe8\x94:\x9d*\xe84\xcb<]\xd0\x19\xb6\xd9Z\xc9\xe4\xe9\xcc:\x9d%\xe8l\xcb<G\xd0\xb9\xf6\xeb\xe3\xef\xca\xd1yu:_\xd0\x05\x96w\xa1\xa0\x8b\x1a\xaf\x9d_\xd2\xc5u\xbaD\xd0\xa5\x96w\x99\xa0\xcb\xd5\x95zY\xaf\x10t\xa5\xb6L\xbd\xecW\t\xba\x1a\xefl\x92\xae\xa9\xd3\xb5}\xabija1^P\x957\x99\x8fW*\xde\xde\x8a\xaek\xe9\x1c\xad"\'\xe43ZB\xc6\xf5\xa4\xd0\xec\xaa\x17\x9b\xaf\x1b\xd9X2nh\x19U\x8a\xe9zw%!J\xc4\xa5\xf7\xdf1^\xba!\x19\x8b%\xaaz\xde\xd0\x8b\xb1\x98\xaa\xf9\xaa\x91\x18\xd2K7f\xed\x06b\xe7\xd3\xb5J\xe3r\xa1wzI/Nl\x08\xba\xc9\xee4z%\xa9\x90|\xdek~\xc4\n\x9a\x91-\xa9\xfc7g\xfb\xfe\xfbw\xe2B\\m\x82J,^L\xc5\xe2\xa9\x94n\xe85-f}\xa7z\x95\xf9\xdf\x84bj\x82mX_x\xe9\x961\x8b\xe8\xd6\x1e\xbaM\xd0\xed\x9dC\xd5\xf3\xb0\xee>\xbe@/\x15\xe8\x8e\xcea\xea\x9bI\xbaz\xa2z\xa2jF\xd1\x9d=t\x97\xa0\xbb\xb3wt\x8e4\x1f\x9e\x9dlB\xa5RJ\xeaq\x10\xf7\xf4\xd0\xbd\x82\xee\xebCL,\x15\nU\xc3"\xee\xef\xa1\x07\x04=\xa8\x88\xe1.bnQ7\xe2yz\xa8\x87\x1e\x16\xf4\x882\xcd\xd9\xb8\x13?\xdaC\x8f\tz\\9#\\a\xd3\x8af\x97\xd3\xe8\x89\x1ezR\xd0S\xca5w\xac\x9d\xec\xe9\x1ezF\xd0\xb3\xea\xcb\xc1\xb8\x91\x9an\xf6Cz\xae\x87\x9e\x17\xf4\x82=\x86{j/\xf6\xd0K\x82^^\xe1\xd3\xadhF\xc5\xdc\x16\xde\xd9\xea\xc2K\xaf\xa8\x07\xf7j\x0f\xbd&\xe8u;\xff\xb4bZW\xe3j\xf4F\x0f\xbd)\xe8\xadnz\xbbN\xef,\xa2w{\xe8=A\xef\xe3a\x96\xe3R\x1d2\xac=H\x1ft\xd3\x87\x82>\xea\xa6\x8f;:\xb27\x18\xf4\x89\xa0OU\xc3\xfd\xec\x7f\xd9q^\xfa|\x05D\xc7\xe4\x05\x86:\xe3\xa8\xfb\x9b\x9c\xd7\n\x9a\xd9l\xbf\xf8\x1f\x12M5O%q\xb3\xbb\xd2\x97\xd9\xe6\x96\xec\xe0\xec\x10\xd5L\xb3\xc3Z\xb2\xdcT\x17\xd2Wu\xfa\xdal\xaa\xdf\x08\xfav\x1e}\xd7b\xbd~\xdf\x0b\xfa\xc1z%\x7f\x14\xf4\x93\xabK\xfe\\\xa7_\x04\xfdjy\xbf\t\xfa\xdd\xd5%\xff\xa8\xd3\x9f\x82\xfe\xb2\xbc\xbf\x05\xfd\xe3\xee\x92\xb2\x9f\x1a\xaf.\xfb\xabO!=\xea\x13\x98l\x82n\x86v\x9a\xa6\x1c\x00x \xccA\x0c\x0f\x86\x1eb\xc1\xae\x1e*\xbd\xc0\x87\xc2\x1e\xc6\xf8*\xd0\xc3-\xdci\xa9r\x04\xe8U\xe1\xae\xc6\xf4\xea\xd0#-\xda\xdda\xe5(\xf0k\xc0_\x93\xf9\xb5\xa0\xd7v&c7\\\xb9\x0e\xf0ua\xaf\xc7\xf8\xfa\xd0\x1bXx\xaf\xfe+7D\xc0F\x00Fs\xc0\xc6\xd0\x9b8\xf3i\xb4c\xb9)\xf8\xcd\xe0o\xce\xfc\x16\xd0[\xba\x06htg\xd9\x82\x801\x00\xb6\xe2\x80\xad\xa1\xb7q\x06h4k\xd9\n~,\xfcq\xcc\xfb\xa0\xfd\xae\x01\x1a\xbd[\xb6! \x00\xa0\x9d\x03\x82\xd0!g\x80F+\x97a\xf0\x11\xf8Q\xe6\xb7\x85\xde\xce5@\xa3\xb3\xcb\xed\x11\xb0\x03\x80\x1d9`\'\xe8\xf1\xce\x00\x8dF/\'\x80\xdf\x19\xfeD\xe6\'AOv\r\xd0\xe8\xfbr\n\x02\xa6\x02\xd8\x85\x03\xa6AOw\x06h\x1c\x03\xe4\x0c\xf0\xbb\xc2\x9f\xc9|\x07\xf4n\xae=d\x9f\n\xe4,\xf0\xbb\xc3\x17\xcc\xcf\x86\x9e\xe3\xec!\xfb\x90 \xe7\x02\xdf\x03\xf6\x9e\x8cwB\xef\xe5Jo\x9f\x19\xe4\xde\xe0\xf7\x81\xbf/\xf3\xf3\xa0\xf7s^\x00\xeb\x08!c\xa0\xf7\x87\x1bg:\x01\x9dt\xbd]\xd6\x89B\xa6\x80k\xb0\xd3\x8cg\xa0\xb3\xce\x9b\x8b\x03\x86\xd4\x01w\xc1\xcc1\x9c\x87.83\xb1\xce\x1b\xb2\x08\xba\x04\xb7\xcc4AK\x8bn\x1c?d\x05\xac\x01\xaf\xcal\rz\xbe\xc3\x9a\xa7\x11\xb9\x00\xecBx\x070{ \xf4A\x16k\x1fN\xe4"\xa0\x07\xc3Z\xcc\xe8\x12\xe8C\x1cT\x9dU\xe4\xa1@\x0f\x83u8\xa3u\xe8nK\x8f\xaa\xcb\x1e\xe8\xa5\xea\xd3<\xc0\xc8e\x90G\xa8OT\xdc\xb8<\x12Y\x8eR\x9f\x1d]\xe6u\xc7\xb2\x0eC\x1e\xad.\x16\xc9cL\xca|\x96\xc9\xac\x96\xcc\xc9c\x95\\\xa6:\xf3qH\xb1\\}\xae\xa8)\x88R\xc9\xf0\xca\xe3W\xec6z\x81\xf3\xb3j\x8e\x8c\'s\x9a\xf4\xca\x13\xcc\x19\xabf\xf0\xed<y\xa2\xba\xb4*\xbf<\tc\x9d\xccww\n\xf4\xa9\xae\x07\x11\xce\xc8\xd3p\x0b\xa7\xc3:\x83\xd13\xa1\xcfrP\xd5\x14\xe4\xd9@\xcf\x81u.\xa3\xe7A\x9f\xefl\x1e\xabG\\\x00\xf8B\x98\x171|1\xf4%\x0el\xf5\x88K\x01_\x06\xf3r\x86\xaf\x80\xbe\xd2\xb5\x8b\xed\x1eq\x15\xf0\xaba_\xc3\xf8\xb5\xd0\xd79\x1b\xd3\xee\x11\xd7\x83\xbe\x01\xee\x8dL\xdf\x04}\xb3\xeb\x05l\xf4\x88[\xc0\xdf\n\xff6\xe6o\x87\xbe\xc3\x99L\xa3G\xdc\t\xfc.\xd8w3~\x0f\xf4\xbd\xae\xfa\xc4=\xe2>\x04\xdc\x0f\xe0\x01\x0ex\x10\xfa!g>\xdc#\x1e\x06\xff\x08\xfcG\x99\x7f\x0c\xfaq\xd7\x00\xdc#\x9e@\xc0\x93\x00\x9e\xe2\x80\xa7\xa1\x9fq\x06\xe0\x1e\xf1,\xf8\xe7\xe0?\xcf\xfc\x0b\xd0/\xba\x06\xe0\x1e\xf1\x12\x02^\x06\xf0\n\x07\xbc\n\xfd\x9a3\x00\xf7\x88\xd7\xc1\xbf\x01\xffM\xe6\xdf\x82~\xdb5\x00\xf7\x88w\x10\xf0.\x80\xf78\xe0}\xe8\x0f\x9c\x01\xb8G|\x08\xfe#\xf8\x1f3\xff\t\xf4\xa7\xae\x01\xb8G|\x86\x80\xcf\x01|\xc1\x01_B\x7f\xe5\x0c\xc0=\xe2k\xf0\xdf\xc0\xff\x96\xf9\xef\xa0\xbfw\xed\xa1F\x8f\xf8\x01\xfc\x8f\xf0\x7fb\xfeg\xe8_\x9c=\xd4\xe8\x11\xbf\x02\xff\r\xf6\xef\x8c\xff\x01\xfd\xa7+}\xa3G\xfc\x05\xfeo\xf8\xff0\xdf\xcfc\xea\xfe\x9e\xbe=\xc2\xe31\xe9&\xb8\xcd\x9e\x06=\x00z\xa0\xe7_=b\x10\xf0\xc1\xb0\x870\xee\x85\x1e\xea\xe9\xd3#\x86\x01^\x05\xe6p\x86G@\xaf\xea\xcc\xc4\xee\x11\xab\x81^\x1d\xeeH\xa6GA\xaf\xe1\xe9\xdd#\xd6\x04\xbb\x16\xbc\xb5\x99]\x07z]\x87E\x8fX\x0f\xec\xfa\xf06`vC\xe8\x8d<\xbdz\xc4h\xa0\x1b\xc3\xda\x84\xd1M\xa17sP\xb3Gl\x0et\x0bX[2\xda\x02=\xc6\xd3\xe8\x11[Ao\xed\xb1{\xc46\x90\xad\x08\x1d\x8b\xebq\x9e\xde\xe5\\\xaa\x1f\x05\xb1B9\xad{c\xb1\xa4\x12\x86\x16\x8b\x99?\x14\xa6\x15\rM\xd6\xec\x9f\xa8\xf6\xaf\x82\xc6\x1f\x05\xfd^\xe9\xfb\xff\xa4i\xc4\xfb\xbc\xd2\xaf\xe2g\xf6\xeb\xbf\xac[\xb6aZ\x81\x95\xe4\x93}\xf2Y\x7f\xa2t%j\xff/\x03\xfbN hO\x00\xcb&:&\xcd\x95!\xf5M\x8f\x0cc:\x11\xf5\xd9\x196\x17il\xad\xa6\'r\xd9\x90?\\\xf0\xb7\x19\xf9d{(\x1aL\xb4\'S2\x95\x0e\x16\x03\xe5\x8a\xfai[-\xa4\x8cR<\x91\xee\xa2\xb44"\x95\xac>\xde\'\xa3*\xc1\x8c\xd1=r[\xa4\xdbN}v\x993\xed\xea;\xec$\xb9=\x86\xdd\x01\xdc\x8e\xff\xd7a\xdbK\xa5r\xc9\xd7\x96\x88&}\xc1\x9a\x1av\'{\xd8\xf1H7\x01\xa9w\xc6\xf5D\xd3\xe9\xdf#\'AMV\x9f\xddr\n\xae\xa7\xf6y\x82+\xfd\xfbpL\xb3\x7f\x1c\xba\xfeN\xdc\xd8\x19\xf1D\xa5\x94\xaf\x1a\x9aW\xeeb\xde\xe6r\xfb\x08`\xfe\x1e\xcc\x0eW\xe7]\x8fy\x1c1\xe4t\x8c8C}\xce\x93\xbbz\xac\xb3\x81\xda\xc53\xf1u\x07\xef\xe2\xdd\xa0g5v\xf1\xee\x90\x02s\x9e\x8d\xeb9\xb8\x9e\x8b\xeb=\xb0\xbb\xf7\xc4u\'\xbe\xdf\xcbLt\r\x8e?{{\xcc\xe3\xcf>\xe6\x9c\xccC\xcfRu\xe8\xd9\x17\xe4<\xf3yxfx\x96e\xfb\x1br?P1<\xae\xfda\xc7\xd5\xe7\xd2\x8ey2aN\xb2\x0b\xf7dF\xa8{\xea\xb2f\x9f\xf4\xf0\xc9&\x85\x08\x8d\xdf\xc94t\xc6\xf5\xfa\xb6\xfbd\x16\xb3\xd4au1\x9a\x83\xce;h[\xde\'\x0b@\x8b\xb0J\x8c\x96\xa1\xc9Uk\nq\x9f\x94`+\xf0\x0cf\xab\xd05\x87\r\xb4\xa5"r>\xd8\x05\xf0\x162{\x00\xf4\x81N)m\x8d\x844\x9f<\x08\xf0"\x98\x073\xbc\x18z\x89\x93XKD2\xf2\x10\xb0\x87\xc2;\x8c\xd9\xc3\xa1\xeb\xae\xc4\xd9D\xd0\'\xbb\x01\xf7\xc0\\\xca\xf02\xe8#\\\x89\xab\xa4N\xb4`\x8f\x82w4\xb3\xc7@\x1f\xebJ\x1cM\xaa\x19\x1f\x07x9\xcc\xe3\x19>\x01\xfaD\'q{<\x91\x91\'\x81=\x19\xde)\xcc\x9e\n}\x9a+\xb1_+\xfa\xe4\xe9\x80\xcf\x80y&\xc3gA\x9f\xed,]"\x95\x93\xe7\x00=\x17\xd6y\x8c\x9e\x0f}\x81k\xe9\xfc5\x9f\xbc\x10\xecE\xf0.f\xf6\x12\xe8K-V}\xf6\x0bG\xe4e /\x87s\x05\x93WB_\xe5\x90\xad\x19y5\xc8k\xe0\\\xcb\xe4u\xd0\xd7;S\xf5\x8fk\x937\x00\xbd\x11\xd6M\x8d7\xedf\xc8[\xf0\x16\xdd\x8a\xeb\xdb\xcc\xad\xbf\x82\xfd\x7f\xbb\xf3\xf6\xde\x01\xf0N\xe7\xf6\xfc)\x95\xff.\xe4\xbf\x1b\xde=<\x95{\xa1\xef\xf3\xb8zq\xa1K\xd1\xf7\x83~\x00\xee\x83L?\x04\xfd\xb0+\xb3V\x88\xcaG\xc0>\n\xef1f\x1f\x87~\xa2\xd7v3\xda\xe4\x93\x80\x9f\x82\xf94\xc3\xcf@?\xeb\xe1\xe3FXKF\xd3j\x1e\xcf\x01\x7f\x1e\xf6\x0b\x8c\xbf\x08\xfd\x92\xc7u~\xf6\x19\xe1PB\x05\xbc\x8c\x80W\x00\xbc\xca\x01\xafA\xbf\xeeq\xce\xcf\xed\xa9|U*\xfe\r\xf0o\xc2\x7f\x8b\xf9\xb7\xa1\xdfq\xe6\xd3\x1a\xd0\xaa\t\xad"\xdf\x05\xfe\x1e\xec\xf7\x19\xff\x00\xfaC\'}"\x1d\xc8D\xc3*\xfdG\xe0?\x86\xff\t\xf3\x9fB\x7f\xe6\x9a\xbf:\xa6\xe6\xb1L\x9f#\xe0\x0b\x00_r\xc0W\xd0_;\xcb\x14\x0e\x15\xa8\xd2.\xbf\x01\xfd-\xdc\xef\x98\xfe\x1e\xfa\x07\xd7\xec\x83\xb9\xac\xac\x95\xe4\x8f\xc0\x7f\x82\xfd3\xe3\xbf@\xff\xea$\x0fd\xb2\xd9xU\xfe\x06\xfaw\xb8\x7f0\xfd\'\xf4_\xae\xe4\xfeR \x97\xae\xca\xbf\x81\xff\x03\xbb_S\x03\xef\xdfdjO\x13o\x83B2\xad\x93lj2\xe1f\x98\x03\x18\x1e\x08=\xa8\xc9\xd9\x8d\xe1v\x7f2"\x07\x83\x1e\x02\xd7\xcb\xf4P\xe8aM<\x93\x80^\x89\xe7\xd53\\\x05\xf8p\xd8#\x18_\x15z5\x07o-\xe8F@\xe1\xab\x03\x1f\t{\x14\xe3k@\xaf\xd9\xe4\xec\xf5B\xa4(\xd7\x02\xbb6\xbcu\x98]\x17z=\x87m\r\xf9Br}\xb0\x1b\xc0\xdb\x90\xd9\x8d\xa0G;\xac\x91Us\xd8\x18\xec&\xf06ev3\xe8\xcd\x9d\x87\xd7\x8a=\xb2\x05\xe0-a\xb60<\x06z\xab\xa6^Uek\xa0\xdb\xc0jm\xb2\xab\xcaX\xc8qMfU\xf1\xe1\xda\xdf\xb4\xe2\xaa\xd2\xd6\xc4U%\x00\xb0\xbd\xef\\\x82\x18 \x043\xccs\x89@G\x1d\xd8\xaa*\xdb\x02\xde\x0e\xe6\xf6\x0c\xef\x00\xbd\xa3;\xb3YVv\x02<\x1e\xe6\x04\x86w\x86\x9e\xe8<>T\x95I`\'\xc3\x9b\xc2\xecT\xe8]\x9a\x9c\x9fH\x8d\xb22\r\xfct\xf83\x98\xdf\x15z\xa6\xc3sU\xe9\x00\xbf\x1b\xfcY\xcc\xef\x0e-\x9a\\?!\x1bee6\x02\xe6\x00\x98\xcb\x01{@\xef\xe9\xeco\xbb\xaat\x82\xde\x0b\xee\xdeL\xef\x03\xbd\xaf+=\x97\x95y\x08\xd8\x0f@\x8c\x03\xf6\x87\x8e;\xf3\xe7\xaa\x92\x00\x9f\x84\x9fb^\x83N\xbb\xde\x08\xbb\xacd\x80ga\xeb\x8cwA\xe7\x9c\xd9\xdbU%\x0f\xba\x00\xb7\xc8t\t\xba\xecJn\x97\x15\x02.aW\x187\xa0\xabNr\xbb\xaa\xd4@\xcf\x87\xbb\x80\xe9\x85\xd0\x07\xb8\n\x85UV\x0e\x04}\x10\xdcEL\x1f\x0c\xbd\xd8\xd9`VUY\x02\xf8\x10\x98\x872|\x18\xf4\xe1\xaeM\xd3(+u\xf0\xdd\xf0{\x98_\n\xbd\xcc\x99\x8a]U\x8e\x00}$\xdc\xa3\x98>\x1a\xfa\x18\xf7^7\xcb\xca\xb1\x80\x8f\x83\xb9\x9c\xe1\xe3\xa1Op\xdeh\xb3\xaa\x9c\x08\xf4$X\'3z\n\xf4\xa9\xae\xbc(+\xa7\x01>\x1d\xe6\x19\x0c\x9f\t}\x96\xf3\x0ea\x8f\x9c\r\xf6\x1cx\xe72{\x1e\xf4\xf9\x0e\xdbj\x96\x95\x0b\xc0^\x08\xef\xa2FY\xb9\x18\xf2\x12\x94\x95Kq}\x99YV\xcc\x13\x8b6\xa3\x9f!/\xc7wW\x98\xa9TQ\xe9\xdf\xd58\xd3_\xd9\xb4\x923\xfdUV\xf5q\x86\xbd\x1a\xc3^\x83<\xd7\xf2\x14\xaf\x83\xbe\xdeyL\xad\x81\x92\xbc\x01\xe8\x8d\xb0nb\xf4f\xe8[\x1c4\xd5\x1e\x97\xb7\x02\xbd\r\xd6\xed\x8c\xde\x01}\xa7\xeb\x89\xa6"T\x93w\x01\xbe\x1b\xe6=\x0c\xdf\x0b}\x9f\x03\x87\xb2\xfe`Z\xde\x0f\xf8\x01\x98\x0f2\xfc\x10\xf4\xc3\xee\xb2Q\xd6\x82\xa5\xa2\xba\xc1G\x10\xf0(\x80\xc78\xe0q\xe8\'\x9c-\x96\xd0\xb3\xc1\x9a!\x9f\x04\xfd\x14\xdc\xa7\x99~\x06\xfaY\xd7\x06\xf6gs\xa5\xbc/(\x9f\x03\xff<\xfc\x17\x98\x7f\x11\xfa%g:\xd1r6_\xca\x98;\xfee\x04\xbc\x02\xe0U\x0ex\r\xfau+\xc0k\x0eP\xd4\x13\xd5L\xd8\\\xa17\x10\xf1&\x88\xb78\xe2m\xe8w\x9c\x08\x7f2\x9e\x0cT\xd2f\xc4\xbb\x88x\x0f\xc4\xfb\x1c\xf1\x01\xf4\x87\xaeg\xe4\xf7\x87\x92\xed\xd1ZN~\x84\x80\x8f\x01|\xc2\x01\x9fB\x7f\xe6\x0c\xd1\x96I\x15\xa3\xf1.\xb3\xda\x7f\x8e\x88/@|\xc9\x11_A\x7fmE\x0c\xc5\x1f\xd0\xd2\xf9L8\x9f6\x17\xe2\x1b\x84|\x0b\xe4;\x0e\xf9\x1e\xfa\x07\xd7 \xfe6Y\xf3i\xe6\xab\xf6#"~\x02\xf13G\xfc\x02\xfd\xabk1\n\xfej> s\xf27\xf0\xbf\xc3\xff\x83\xf9?\xa1\xffj\xe2\xaa\x99\xd4\xba\xcaQ\xbf.\xff\x06\xfe\x0f\xec~\xcd|\xbaj\xc6\xe9\xaa\xd9Y\x8aD1\x9f\xcb\xe6\xcd\t55\xe3\x88\x05b\x00G\x0c\x84\x1e\xd4\xcc\x03\xb4E\xa5\xd6\x95*\xcb\xc1\xc0\x87\xc0\xf62>\x14z\x98k\x00\x7f&\x91\xf0\xe5\xcdn\xbe\n"\x86\x83\x18\xc1\x11\xabB\xaf\xd6\xcc\x9b5\x94\x95\x91JJ\xae\x0ez$\xdcQL\xaf\x01\xbdf\xb3\xb3\xcemFW&en\x8c\xb5\x10\xb06\x80u8`]\xe8\xf5\x9a\xf9M\x8b\xa4\xb3\x85\xa4\\\x1f\xf0\x0607dx#\xe8\xd1\xce\\Z\xfd\xe1D\xaa$7\x06\xbd\t\xdcM\x99\xde\x0czs\x87\x8eT\n\x86y\xdc\x02\xbd%\xdc\x16\xa6\xc7@o\xd5\xec\x14\xc6d[In\rv\x1bx\xad\xcc\x8e\x85\x1eg\xb1\xe6O\xc3bH\xfa@\xfa\xe1\xb41\x19\x80nw\xc8\xd6\x8a\x0c\x82\x0c\xc1\t3\x19\x81\x8e6\xf7:\xeem\x0bt;X\xdb7\xdbuy\x07\xc8\x1d\x9b\xcd\xba\xbc\x13\xae\xc77\xaf\xf8\xb87\xa1\x99\x8f{;\x03\x9c\xe8\xba=\xf3M\x9a\x84\xfc\x93\xe1M\xe1\xa9L\x85\xde\xc5\x99t[HN\x039\x1d\xce\x0c&w\x85\x9e\xe9L\xba5h\xc8\x0e\xa0\xbb\xc1\x9a\xc5\xe8\xee\xd0\xc2I\x1a\xf6\xcb\xd9 \xe7\xc0\x99\xcb\xe4\x1e\xd0{:[\xa25bn\xcfN\xc0{\xc1\xdc\x9b\xe1}\xa0\xf7u\xd2\xfaSr\x1e\xc8\xfd\xe0\xc4\x98\xdc\x1f:\xde\xe7\t$\xc0&\xe1\xa5\x98\xd5\xa0\xd3\xbd\x17#\x034\x0bKo,F\x17d\x0e\x8b\x91\xc7ua%\x8bQt\x16\xa3\x04\xb0\xec\xa47gBH/aUx&\x06t\xd5\xf5\x84\xd5b\xd4\x80\xce\x87\xb5\x80\xd1\x85\xd0\x078\x8fB\xad\xc5\x81 \x0f\x82\xb3\x88\xc9\x83\xa1\x17\xbb\x92\xaa\xc5X\x02\xf4\x10X\x872z\x18\xf4\xe1\xceS\xc3Z\xd4\xc1v\xc3\xebav)\xf42WZ\xb5\x18G\x00=\x12\xd6Q\x8c\x1e\r}L\xef\'p,\xd0\xe3`-g\xf4x\xe8\x13\\\xebf.\xc6\x89`O\x82wrc1N\x81<\x15\x8bq\x1a\xaeO7\x17\xc3|=pb9\x03\xdf\x9d\t\xff,\xf59\xf6?\x96xi\x7f'
So, SageMath does not seem to be using the fact that this is an orthogonal matrix at all or that's it's 2×2.
The algorithm it's using is the one we learned in school for square matrices over fields.
So, we can gain a factor 200 here by implementing the obvious algorithm, see Zulip. Are we using inverses of matrices elsewhere in sage-flatsurf @videlec ?
I don't think that we do in any critical way.
Ok. So I'll merge this as is. I don't think we want these overly careful checks here anyway. (It worked for all triangles up to a+b+c=100+, so I'll just declare this correct.)
by not checking that result is actually a group. We just have to trust that sage-flatsurf does the right thing here since the actual verification is extremely expensive.