geometry.rlg 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381
  1. Sun Aug 18 20:49:37 2002 run on Windows
  2. Geometry 1.1 Last update Sept 6, 1998
  3. % Author H.-G. Graebe | Univ. Leipzig | Version 6.9.1998
  4. % graebe@informatik.uni-leipzig.de
  5. comment
  6. Test suite for the package GEOMETRY 1.1
  7. end comment;
  8. algebraic;
  9. load cali,geometry;
  10. off nat;
  11. on echo;
  12. showtime;
  13. Time: 10 ms plus GC time: 200 ms
  14. % #####################
  15. % Some one line proofs
  16. % #####################
  17. % A generic triangle ABC
  18. A:=Point(a1,a2);
  19. a := {a1,a2}$
  20. B:=Point(b1,b2);
  21. b := {b1,b2}$
  22. C:=Point(c1,c2);
  23. c := {c1,c2}$
  24. % Its midpoint perpendiculars have a point in common:
  25. concurrent(mp(a,b),mp(b,c),mp(c,a));
  26. 0$
  27. % This point
  28. M:=intersection_point(mp(a,b),mp(b,c));
  29. m := {(a1**2*b2 - a1**2*c2 + a2**2*b2 - a2**2*c2 - a2*b1**2 - a2*b2**2 + a2*c1**
  30. 2 + a2*c2**2 + b1**2*c2 + b2**2*c2 - b2*c1**2 - b2*c2**2)/(2*(a1*b2 - a1*c2 - a2
  31. *b1 + a2*c1 + b1*c2 - b2*c1)),
  32. ( - a1**2*b1 + a1**2*c1 + a1*b1**2 + a1*b2**2 - a1*c1**2 - a1*c2**2 - a2**2*b1 +
  33. a2**2*c1 - b1**2*c1 + b1*c1**2 + b1*c2**2 - b2**2*c1)/(2*(a1*b2 - a1*c2 - a2*b1
  34. + a2*c1 + b1*c2 - b2*c1))}$
  35. % is the center of the circumscribed circle
  36. sqrdist(M,A) - sqrdist(M,B);
  37. 0$
  38. % The altitutes intersection theorem
  39. concurrent(altitude(a,b,c),altitude(b,c,a),altitude(c,a,b));
  40. 0$
  41. % The median intersection theorem
  42. concurrent(median(a,b,c),median(b,c,a),median(c,a,b));
  43. 0$
  44. % Euler's line
  45. M:=intersection_point(mp(a,b),mp(b,c));
  46. m := {(a1**2*b2 - a1**2*c2 + a2**2*b2 - a2**2*c2 - a2*b1**2 - a2*b2**2 + a2*c1**
  47. 2 + a2*c2**2 + b1**2*c2 + b2**2*c2 - b2*c1**2 - b2*c2**2)/(2*(a1*b2 - a1*c2 - a2
  48. *b1 + a2*c1 + b1*c2 - b2*c1)),
  49. ( - a1**2*b1 + a1**2*c1 + a1*b1**2 + a1*b2**2 - a1*c1**2 - a1*c2**2 - a2**2*b1 +
  50. a2**2*c1 - b1**2*c1 + b1*c1**2 + b1*c2**2 - b2**2*c1)/(2*(a1*b2 - a1*c2 - a2*b1
  51. + a2*c1 + b1*c2 - b2*c1))}$
  52. H:=intersection_point(altitude(a,b,c),altitude(b,c,a));
  53. h := {( - a1*a2*b1 + a1*a2*c1 + a1*b1*b2 - a1*c1*c2 - a2**2*b2 + a2**2*c2 + a2*
  54. b2**2 - a2*c2**2 - b1*b2*c1 + b1*c1*c2 - b2**2*c2 + b2*c2**2)/(a1*b2 - a1*c2 -
  55. a2*b1 + a2*c1 + b1*c2 - b2*c1),
  56. (a1**2*b1 - a1**2*c1 + a1*a2*b2 - a1*a2*c2 - a1*b1**2 + a1*c1**2 - a2*b1*b2 + a2
  57. *c1*c2 + b1**2*c1 + b1*b2*c2 - b1*c1**2 - b2*c1*c2)/(a1*b2 - a1*c2 - a2*b1 + a2*
  58. c1 + b1*c2 - b2*c1)}$
  59. S:=intersection_point(median(a,b,c),median(b,c,a));
  60. s := {(a1 + b1 + c1)/3,(a2 + b2 + c2)/3}$
  61. collinear(M,H,S);
  62. 0$
  63. sqrdist(S,varpoint(M,H,2/3));
  64. 0$
  65. % Feuerbach's circle
  66. % Choose a special coordinate system
  67. A:=Point(0,0);
  68. a := {0,0}$
  69. B:=Point(u1,0);
  70. b := {u1,0}$
  71. C:=Point(u2,u3);
  72. c := {u2,u3}$
  73. M:=intersection_point(mp(a,b),mp(b,c));
  74. m := {u1/2,( - u1*u2 + u2**2 + u3**2)/(2*u3)}$
  75. H:=intersection_point(altitude(a,b,c),altitude(b,c,a));
  76. h := {u2,(u2*(u1 - u2))/u3}$
  77. N:=midpoint(M,H);
  78. n := {(u1 + 2*u2)/4,(u1*u2 - u2**2 + u3**2)/(4*u3)}$
  79. sqrdist(N,midpoint(A,B))-sqrdist(N,midpoint(B,C));
  80. 0$
  81. sqrdist(N,midpoint(A,B))-sqrdist(N,midpoint(H,C));
  82. 0$
  83. D:=intersection_point(pp_line(A,B),pp_line(H,C));
  84. d := {u2,0}$
  85. sqrdist(N,midpoint(A,B))-sqrdist(N,D);
  86. 0$
  87. clear_ndg();
  88. {}$
  89. clear(A,B,C,D,M,H,S,N);
  90. % #############################
  91. % Non-linear Geometric Objects
  92. % #############################
  93. % Bisector intersection theorem
  94. A:=Point(0,0);
  95. a := {0,0}$
  96. B:=Point(1,0);
  97. b := {1,0}$
  98. C:=Point(u1,u2);
  99. c := {u1,u2}$
  100. P:=Point(x1,x2);
  101. p := {x1,x2}$
  102. polys:={
  103. point_on_bisector(P,A,B,C),
  104. point_on_bisector(P,B,C,A),
  105. point_on_bisector(P,C,A,B)};
  106. polys := { - 2*u1*x1*x2 + 2*u1*x2 + u2*x1**2 - 2*u2*x1 - u2*x2**2 + u2 + 2*x1*x2
  107. - 2*x2,
  108. - 2*u1**3*x2 + 2*u1**2*u2*x1 - u1**2*u2 + 2*u1**2*x1*x2 + 2*u1**2*x2 - 2*u1*u2
  109. **2*x2 - 2*u1*u2*x1**2 + 2*u1*u2*x2**2 - 2*u1*x1*x2 + 2*u2**3*x1 - u2**3 - 2*u2
  110. **2*x1*x2 + 2*u2**2*x2 + u2*x1**2 - u2*x2**2,
  111. 2*u1*x1*x2 - u2*x1**2 + u2*x2**2}$
  112. con1:=num(sqrdist(P,pedalpoint(p,pp_line(A,C)))-x2^2);
  113. con1 := u2*( - 2*u1**3*x1*x2 + u1**2*u2*x1**2 - u1**2*u2*x2**2 - 2*u1*u2**2*x1*
  114. x2 + u2**3*x1**2 - u2**3*x2**2)$
  115. con2:=num(sqrdist(p,pedalpoint(p,pp_line(B,C)))-x2^2);
  116. con2 := u2*( - 2*u1**3*x1*x2 + 2*u1**3*x2 + u1**2*u2*x1**2 - 2*u1**2*u2*x1 - u1
  117. **2*u2*x2**2 + u1**2*u2 + 6*u1**2*x1*x2 - 6*u1**2*x2 - 2*u1*u2**2*x1*x2 + 2*u1*
  118. u2**2*x2 - 2*u1*u2*x1**2 + 4*u1*u2*x1 + 2*u1*u2*x2**2 - 2*u1*u2 - 6*u1*x1*x2 + 6
  119. *u1*x2 + u2**3*x1**2 - 2*u2**3*x1 - u2**3*x2**2 + u2**3 + 2*u2**2*x1*x2 - 2*u2**
  120. 2*x2 + u2*x1**2 - 2*u2*x1 - u2*x2**2 + u2 + 2*x1*x2 - 2*x2)$
  121. setring({x1,x2},{},lex);
  122. {{x1,x2},{},lex,{1,1}}$
  123. setideal(polys,polys);
  124. {u2*x1**2 - (2*u1 - 2)*x1*x2 - (2*u2)*x1 - u2*x2**2 + (2*u1 - 2)*x2 + u2,
  125. - (2*u1*u2 - u2)*x1**2 + (2*u1**2 - 2*u1 - 2*u2**2)*x1*x2 + (2*u1**2*u2 + 2*u2
  126. **3)*x1 + (2*u1*u2 - u2)*x2**2 - (2*u1**3 - 2*u1**2 + 2*u1*u2**2 - 2*u2**2)*x2 -
  127. (u1**2*u2 + u2**3),
  128. - u2*x1**2 + (2*u1)*x1*x2 + u2*x2**2}$
  129. gbasis polys;
  130. {(4*u2)*x2**4 - (8*u1**2 - 8*u1 + 8*u2**2)*x2**3 + (4*u1**2*u2 - 4*u1*u2 + 4*u2
  131. **3 - 4*u2)*x2**2 + (4*u2**2)*x2 - u2**3,
  132. (2*u1*u2**2 - u2**2)*x1 + (2*u2)*x2**3 - (4*u1**2 - 4*u1 + 2*u2**2)*x2**2 - (2*
  133. u1**2*u2 - 2*u1*u2 + 2*u2)*x2 - (u1*u2**2 - u2**2)}$
  134. {con1,con2} mod gbasis polys;
  135. {0,0}$
  136. % Bisector intersection theorem. A constructive proof.
  137. A:=Point(0,0);
  138. a := {0,0}$
  139. B:=Point(1,0);
  140. b := {1,0}$
  141. P:=Point(u1,u2);
  142. p := {u1,u2}$
  143. l1:=pp_line(A,B);
  144. l1 := {0,-1,0}$
  145. l2:=symline(l1,pp_line(A,P));
  146. l2 := { - 2*u1*u2,u1**2 - u2**2,0}$
  147. l3:=symline(l1,pp_line(B,P));
  148. l3 := {2*u2*( - u1 + 1),
  149. u1**2 - 2*u1 - u2**2 + 1,
  150. 2*u2*(u1 - 1)}$
  151. point_on_bisector(P,A,B,intersection_point(l2,l3));
  152. 0$
  153. clear_ndg();
  154. {}$
  155. clear(A,B,C,P,l1,l2,l3);
  156. % Miquel's theorem
  157. on gcd;
  158. A:=Point(0,0);
  159. a := {0,0}$
  160. B:=Point(1,0);
  161. b := {1,0}$
  162. C:=Point(c1,c2);
  163. c := {c1,c2}$
  164. P:=choose_pl(pp_line(A,B),u1);
  165. p := {u1,0}$
  166. Q:=choose_pl(pp_line(B,C),u2);
  167. q := {u2,(c2*(u2 - 1))/(c1 - 1)}$
  168. R:=choose_pl(pp_line(A,C),u3);
  169. r := {u3,(c2*u3)/c1}$
  170. X:=other_cc_point(P,p3_circle(A,P,R),p3_circle(B,P,Q))$
  171. point_on_circle(X,p3_circle(C,Q,R));
  172. 0$
  173. off gcd;
  174. clear_ndg();
  175. {}$
  176. clear(A,B,C,P,Q,R,X);
  177. % ########################
  178. % Theorems of linear type
  179. % ########################
  180. % Pappus' theorem
  181. A:=Point(u1,u2);
  182. a := {u1,u2}$
  183. B:=Point(u3,u4);
  184. b := {u3,u4}$
  185. C:=Point(x1,u5);
  186. c := {x1,u5}$
  187. P:=Point(u6,u7);
  188. p := {u6,u7}$
  189. Q:=Point(u8,u9);
  190. q := {u8,u9}$
  191. R:=Point(u0,x2);
  192. r := {u0,x2}$
  193. polys:={collinear(A,B,C), collinear(P,Q,R)};
  194. polys := {u1*u4 - u1*u5 - u2*u3 + u2*x1 + u3*u5 - u4*x1,
  195. u0*u7 - u0*u9 + u6*u9 - u6*x2 - u7*u8 + u8*x2}$
  196. con:=collinear(
  197. intersection_point(pp_line(A,Q),pp_line(P,B)),
  198. intersection_point(pp_line(A,R),pp_line(P,C)),
  199. intersection_point(pp_line(B,R),pp_line(Q,C)))$
  200. vars:={x1,x2};
  201. vars := {x1,x2}$
  202. sol:=solve(polys,vars);
  203. sol := {{x1=( - u1*u4 + u1*u5 + u2*u3 - u3*u5)/(u2 - u4),
  204. x2=(u0*u7 - u0*u9 + u6*u9 - u7*u8)/(u6 - u8)}}$
  205. sub(sol,con);
  206. 0$
  207. % Pappus' theorem. A constructive approach
  208. A:=Point(u1,u2);
  209. a := {u1,u2}$
  210. B:=Point(u3,u4);
  211. b := {u3,u4}$
  212. P:=Point(u6,u7);
  213. p := {u6,u7}$
  214. Q:=Point(u8,u9);
  215. q := {u8,u9}$
  216. C:=choose_pl(pp_line(A,B),u5);
  217. c := {u5,
  218. (u1*u4 - u2*u3 + u2*u5 - u4*u5)/(u1 - u3)}$
  219. R:=choose_pl(pp_line(P,Q),u0);
  220. r := {u0,
  221. (u0*u7 - u0*u9 + u6*u9 - u7*u8)/(u6 - u8)}$
  222. con:=collinear(intersection_point(pp_line(A,Q),pp_line(P,B)),
  223. intersection_point(pp_line(A,R),pp_line(P,C)),
  224. intersection_point(pp_line(B,R),pp_line(Q,C)));
  225. con := 0$
  226. clear_ndg();
  227. {}$
  228. clear(A,B,C,P,Q,R);
  229. % ###########################
  230. % Theorems of non linear type
  231. % ###########################
  232. % Fermat Point
  233. A:=Point(0,0);
  234. a := {0,0}$
  235. B:=Point(0,2);
  236. b := {0,2}$
  237. C:=Point(u1,u2);
  238. c := {u1,u2}$
  239. P:=Point(x1,x2);
  240. p := {x1,x2}$
  241. Q:=Point(x3,x4);
  242. q := {x3,x4}$
  243. R:=Point(x5,x6);
  244. r := {x5,x6}$
  245. polys1:={sqrdist(P,B)-sqrdist(B,C), sqrdist(P,C)-sqrdist(B,C),
  246. sqrdist(Q,A)-sqrdist(A,C), sqrdist(Q,C)-sqrdist(A,C),
  247. sqrdist(R,B)-sqrdist(A,B), sqrdist(R,A)-sqrdist(A,B)};
  248. polys1 := { - u1**2 - u2**2 + 4*u2 + x1**2 + x2**2 - 4*x2,
  249. - 2*u1*x1 - 2*u2*x2 + 4*u2 + x1**2 + x2**2 - 4,
  250. - u1**2 - u2**2 + x3**2 + x4**2,
  251. - 2*u1*x3 - 2*u2*x4 + x3**2 + x4**2,
  252. x5**2 + x6**2 - 4*x6,
  253. x5**2 + x6**2 - 4}$
  254. con:=concurrent(pp_line(A,P), pp_line(B,Q), pp_line(C,R));
  255. con := - u1*x1*x4*x6 + 2*u1*x1*x6 + u1*x2*x3*x6 - 2*u1*x2*x3 + 2*u2*x1*x3 + u2*
  256. x1*x4*x5 - 2*u2*x1*x5 - u2*x2*x3*x5 - 2*x1*x3*x6 + 2*x2*x3*x5$
  257. vars:={x1,x2,x3,x4,x5,x6};
  258. vars := {x1,
  259. x2,
  260. x3,
  261. x4,
  262. x5,
  263. x6}$
  264. setring(vars,{},lex);
  265. {{x1,x2,x3,x4,x5,x6},{},lex,{1,1,1,1,1,1}}$
  266. iso:=isolatedprimes polys1;
  267. iso := {{x5**2 - 3,
  268. x6 - 1,
  269. u1*x5 - u2 + 2*x4,
  270. - u1*x5 - u2 + 2*x2 - 2,
  271. - u1 - u2*x5 + 2*x3,
  272. - u1 + u2*x5 + 2*x1 - 2*x5},
  273. {x5**2 - 3,
  274. x6 - 1,
  275. - u1*x5 - u2 + 2*x4,
  276. u1*x5 - u2 + 2*x2 - 2,
  277. - u1 + u2*x5 + 2*x3,
  278. - u1 - u2*x5 + 2*x1 + 2*x5},
  279. {x5**2 - 3,
  280. x6 - 1,
  281. u1*x5 - u2 + 2*x4,
  282. u1*x5 - u2 + 2*x2 - 2,
  283. - u1 - u2*x5 + 2*x3,
  284. - u1 - u2*x5 + 2*x1 + 2*x5},
  285. {x5**2 - 3,
  286. x6 - 1,
  287. - u1*x5 - u2 + 2*x4,
  288. - u1*x5 - u2 + 2*x2 - 2,
  289. - u1 + u2*x5 + 2*x3,
  290. - u1 + u2*x5 + 2*x1 - 2*x5}}$
  291. for each u in iso collect con mod u;
  292. { - 3*u1**2*u2 + 3*u1**2 - 2*u1*u2*x5 + 2*u1*x5 - 3*u2**3 + 9*u2**2 - 6*u2,
  293. 0,
  294. (u1**3*x5 + 3*u1**2*u2 - 6*u1**2 + u1*u2**2*x5 - 4*u1*u2*x5 + 3*u2**3 - 18*u2**2
  295. + 24*u2)/2,
  296. ( - u1**3*x5 + 3*u1**2*u2 - u1*u2**2*x5 + 4*u1*x5 + 3*u2**3 - 12*u2)/2}$
  297. polys2:={sqrdist(P,B)-sqrdist(P,C),
  298. sqrdist(Q,A)-sqrdist(Q,C),
  299. sqrdist(R,A)-sqrdist(R,B),
  300. num(p3_angle(R,A,B)-p3_angle(P,B,C)),
  301. num(p3_angle(Q,C,A)-p3_angle(P,B,C))};
  302. polys2 := { - u1**2 + 2*u1*x1 - u2**2 + 2*u2*x2 - 4*x2 + 4,
  303. - u1**2 + 2*u1*x3 - u2**2 + 2*u2*x4,
  304. 4*(x6 - 1),
  305. - u1*x1*x5 - u1*x2*x6 + 2*u1*x6 + u2*x1*x6 - u2*x2*x5 + 2*u2*x5 - 2*x1*x6 + 2*
  306. x2*x5 - 4*x5,
  307. u1**3*x2 - 2*u1**3 - u1**2*u2*x1 + u1**2*x1*x4 + 2*u1**2*x1 - u1**2*x2*x3 + 2*u1
  308. **2*x3 + u1*u2**2*x2 - 2*u1*u2**2 - 2*u1*x1*x3 - 2*u1*x2*x4 + 4*u1*x4 - u2**3*x1
  309. + u2**2*x1*x4 + 2*u2**2*x1 - u2**2*x2*x3 + 2*u2**2*x3 - 2*u2*x1*x4 + 2*u2*x2*x3
  310. - 4*u2*x3}$
  311. sol:=solve(polys2,{x1,x2,x3,x4,x6});
  312. sol := {{x1=(u1 + u2*x5 - 2*x5)/2,
  313. x2=( - u1*x5 + u2 + 2)/2,
  314. x3=(u1 - u2*x5)/2,
  315. x4=(u1*x5 + u2)/2,
  316. x6=1}}$
  317. sub(sol,con);
  318. 0$
  319. clear_ndg();
  320. {}$
  321. clear(A,B,C,P,Q,R);
  322. % ####################
  323. % Desargue's theorem
  324. % ####################
  325. % A constructive proof.
  326. A:=Point(a1,a2);
  327. a := {a1,a2}$
  328. B:=Point(b1,b2);
  329. b := {b1,b2}$
  330. C:=Point(c1,c2);
  331. c := {c1,c2}$
  332. R:=Point(d1,d2);
  333. r := {d1,d2}$
  334. S:=choose_pl(par(R,pp_line(A,B)),u);
  335. s := {u,
  336. (a1*d2 - a2*d1 + a2*u - b1*d2 + b2*d1 - b2*u)/(a1 - b1)}$
  337. T:=intersection_point(par(R,pp_line(A,C)),par(S,pp_line(B,C)));
  338. t := {(a1*u - b1*d1 + c1*d1 - c1*u)/(a1 - b1),
  339. (a1*d2 - a2*d1 + a2*u - b1*d2 + c2*d1 - c2*u)/(a1 - b1)}$
  340. con:=concurrent(pp_line(A,R),pp_line(B,S),pp_line(C,T));
  341. con := 0$
  342. % Desargue's theorem as theorem of linear type.
  343. A:=Point(u1,u2);
  344. a := {u1,u2}$
  345. B:=Point(u3,u4);
  346. b := {u3,u4}$
  347. C:=Point(u5,u6);
  348. c := {u5,u6}$
  349. R:=Point(u7,u8);
  350. r := {u7,u8}$
  351. S:=Point(u9,x1);
  352. s := {u9,x1}$
  353. T:=Point(x2,x3);
  354. t := {x2,x3}$
  355. polys:={parallel(pp_line(R,S),pp_line(A,B)),
  356. parallel(pp_line(S,T),pp_line(B,C)),
  357. parallel(pp_line(R,T),pp_line(A,C))};
  358. polys := { - u1*u8 + u1*x1 + u2*u7 - u2*u9 + u3*u8 - u3*x1 - u4*u7 + u4*u9,
  359. - u3*x1 + u3*x3 + u4*u9 - u4*x2 + u5*x1 - u5*x3 - u6*u9 + u6*x2,
  360. - u1*u8 + u1*x3 + u2*u7 - u2*x2 + u5*u8 - u5*x3 - u6*u7 + u6*x2}$
  361. con:=concurrent(pp_line(A,R),pp_line(B,S),pp_line(C,T));
  362. con := - u1*u3*u6*u8 + u1*u3*u6*x1 + u1*u3*u8*x3 - u1*u3*x1*x3 + u1*u4*u5*u8 -
  363. u1*u4*u5*x3 - u1*u4*u6*u9 + u1*u4*u6*x2 - u1*u4*u8*x2 + u1*u4*u9*x3 - u1*u5*u8*
  364. x1 + u1*u5*x1*x3 + u1*u6*u8*u9 - u1*u6*x1*x2 - u1*u8*u9*x3 + u1*u8*x1*x2 - u2*u3
  365. *u5*x1 + u2*u3*u5*x3 + u2*u3*u6*u7 - u2*u3*u6*x2 - u2*u3*u7*x3 + u2*u3*x1*x2 -
  366. u2*u4*u5*u7 + u2*u4*u5*u9 + u2*u4*u7*x2 - u2*u4*u9*x2 + u2*u5*u7*x1 - u2*u5*u9*
  367. x3 - u2*u6*u7*u9 + u2*u6*u9*x2 + u2*u7*u9*x3 - u2*u7*x1*x2 + u3*u5*u8*x1 - u3*u5
  368. *u8*x3 - u3*u6*u7*x1 + u3*u6*u8*x2 + u3*u7*x1*x3 - u3*u8*x1*x2 + u4*u5*u7*x3 -
  369. u4*u5*u8*u9 + u4*u6*u7*u9 - u4*u6*u7*x2 - u4*u7*u9*x3 + u4*u8*u9*x2 - u5*u7*x1*
  370. x3 + u5*u8*u9*x3 + u6*u7*x1*x2 - u6*u8*u9*x2$
  371. sol:=solve(polys,{x1,x2,x3});
  372. sol := {{x1=(u1*u8 - u2*u7 + u2*u9 - u3*u8 + u4*u7 - u4*u9)/(u1 - u3),
  373. x2=(u1*u9 - u3*u7 + u5*u7 - u5*u9)/(u1 - u3),
  374. x3=(u1*u8 - u2*u7 + u2*u9 - u3*u8 + u6*u7 - u6*u9)/(u1 - u3)}}$
  375. sub(sol,con);
  376. 0$
  377. % The general theorem of Desargue.
  378. A:=Point(0,0);
  379. a := {0,0}$
  380. B:=Point(0,1);
  381. b := {0,1}$
  382. C:=Point(u5,u6);
  383. c := {u5,u6}$
  384. R:=Point(u7,u8);
  385. r := {u7,u8}$
  386. S:=Point(u9,u1);
  387. s := {u9,u1}$
  388. T:=Point(u2,x1);
  389. t := {u2,x1}$
  390. con1:=collinear(intersection_point(pp_line(R,S),pp_line(A,B)),
  391. intersection_point(pp_line(S,T),pp_line(B,C)),
  392. intersection_point(pp_line(R,T),pp_line(A,C)));
  393. con1 := (u5*( - u1**2*u2**2*u6*u7 + u1**2*u2*u5*u7*x1 + u1**2*u2*u6*u7**2 - u1**
  394. 2*u5*u7**2*x1 + u1*u2**2*u6*u7*u8 + u1*u2**2*u6*u7 + u1*u2**2*u6*u8*u9 - u1*u2**
  395. 2*u8*u9 - u1*u2*u5*u7*u8*x1 - u1*u2*u5*u7*x1 - u1*u2*u5*u8*u9*x1 + u1*u2*u5*u8*
  396. u9 - u1*u2*u6*u7**2*x1 - u1*u2*u6*u7**2 - 2*u1*u2*u6*u7*u8*u9 + u1*u2*u6*u7*u9*
  397. x1 - u1*u2*u6*u7*u9 + u1*u2*u7*u8*u9 + u1*u2*u7*u9*x1 + u1*u5*u7**2*x1**2 + u1*
  398. u5*u7**2*x1 + 2*u1*u5*u7*u8*u9*x1 - u1*u5*u7*u8*u9 - u1*u5*u7*u9*x1**2 + u1*u6*
  399. u7**2*u9 - u1*u7**2*u9*x1 - u2**2*u6*u7*u8 - u2**2*u6*u8**2*u9 + u2**2*u8**2*u9
  400. + u2*u5*u7*u8*x1 + u2*u5*u8**2*u9*x1 - u2*u5*u8**2*u9 + u2*u6*u7**2*x1 + u2*u6*
  401. u7*u8*u9*x1 + 2*u2*u6*u7*u8*u9 - u2*u6*u7*u9*x1 + u2*u6*u8**2*u9**2 - u2*u6*u8*
  402. u9**2*x1 - 2*u2*u7*u8*u9*x1 - u2*u8**2*u9**2 + u2*u8*u9**2*x1 - u5*u7**2*x1**2 -
  403. u5*u7*u8*u9*x1**2 + u5*u7*u9*x1**2 - u5*u8**2*u9**2*x1 + u5*u8**2*u9**2 + u5*u8
  404. *u9**2*x1**2 - u5*u8*u9**2*x1 - u6*u7**2*u9*x1 - u6*u7*u8*u9**2 + u6*u7*u9**2*x1
  405. + u7**2*u9*x1**2 + u7*u8*u9**2*x1 - u7*u9**2*x1**2))/(u1*u2*u5*u6*u7 - u1*u2*u5
  406. *u6*u9 + u1*u5**2*u7*u8 - u1*u5**2*u7*x1 - u1*u5**2*u8*u9 + u1*u5**2*u9*x1 - u1*
  407. u5*u6*u7**2 + u1*u5*u6*u7*u9 + u2**2*u6**2*u7 - u2**2*u6**2*u9 - u2**2*u6*u7 +
  408. u2**2*u6*u9 + u2*u5*u6*u7*u8 - 2*u2*u5*u6*u7*x1 - u2*u5*u6*u8*u9 + 2*u2*u5*u6*u9
  409. *x1 - u2*u5*u7*u8 + u2*u5*u7*x1 + u2*u5*u8*u9 - u2*u5*u9*x1 - u2*u6**2*u7**2 +
  410. u2*u6**2*u9**2 + u2*u6*u7**2 - u2*u6*u9**2 - u5**2*u7*u8*x1 + u5**2*u7*x1**2 +
  411. u5**2*u8*u9*x1 - u5**2*u9*x1**2 + u5*u6*u7**2*x1 - u5*u6*u7*u8*u9 + u5*u6*u8*u9
  412. **2 - u5*u6*u9**2*x1 + u5*u7*u8*u9 - u5*u7*u9*x1 - u5*u8*u9**2 + u5*u9**2*x1 +
  413. u6**2*u7**2*u9 - u6**2*u7*u9**2 - u6*u7**2*u9 + u6*u7*u9**2)$
  414. con2:=concurrent(pp_line(A,R),pp_line(B,S),pp_line(C,T));
  415. con2 := u1*u2*u6*u7 - u1*u5*u7*x1 - u2*u6*u7 - u2*u6*u8*u9 + u2*u8*u9 + u5*u7*x1
  416. + u5*u8*u9*x1 - u5*u8*u9 + u6*u7*u9 - u7*u9*x1$
  417. sol:=solve(con2,x1);
  418. sol := {x1=(u1*u2*u6*u7 - u2*u6*u7 - u2*u6*u8*u9 + u2*u8*u9 - u5*u8*u9 + u6*u7*
  419. u9)/(u1*u5*u7 - u5*u7 - u5*u8*u9 + u7*u9)}$
  420. sub(sol,con1);
  421. 0$
  422. clear_ndg();
  423. {}$
  424. clear(A,B,C,R,S,T);
  425. % #################
  426. % Brocard points
  427. % #################
  428. A:=Point(0,0);
  429. a := {0,0}$
  430. B:=Point(1,0);
  431. b := {1,0}$
  432. C:=Point(u1,u2);
  433. c := {u1,u2}$
  434. c1:=Circle(1,x1,x2,x3);
  435. c1 := {1,x1,x2,x3}$
  436. c2:=Circle(1,x4,x5,x6);
  437. c2 := {1,x4,x5,x6}$
  438. c3:=Circle(1,x7,x8,x9);
  439. c3 := {1,x7,x8,x9}$
  440. polys:={
  441. cl_tangent(c1,pp_line(A,C)),
  442. point_on_circle(A,c1),
  443. point_on_circle(B,c1),
  444. cl_tangent(c2,pp_line(A,B)),
  445. point_on_circle(B,c2),
  446. point_on_circle(C,c2),
  447. cl_tangent(c3,pp_line(B,C)),
  448. point_on_circle(A,c3),
  449. point_on_circle(C,c3)};
  450. polys := {u1**2*x1**2 - 4*u1**2*x3 + 2*u1*u2*x1*x2 + u2**2*x2**2 - 4*u2**2*x3,
  451. x3,
  452. x1 + x3 + 1,
  453. x4**2 - 4*x6,
  454. x4 + x6 + 1,
  455. u1**2 + u1*x4 + u2**2 + u2*x5 + x6,
  456. u1**2*x7**2 - 4*u1**2*x9 + 2*u1*u2*x7*x8 + 4*u1*u2*x8 - 2*u1*x7**2 + 8*u1*x9 - 4
  457. *u2**2*x7 + u2**2*x8**2 - 4*u2**2*x9 - 4*u2**2 - 2*u2*x7*x8 - 4*u2*x8 + x7**2 -
  458. 4*x9,
  459. x9,
  460. u1**2 + u1*x7 + u2**2 + u2*x8 + x9}$
  461. vars:={x1,x2,x3,x4,x5,x6,x7,x8,x9};
  462. vars := {x1,
  463. x2,
  464. x3,
  465. x4,
  466. x5,
  467. x6,
  468. x7,
  469. x8,
  470. x9}$
  471. sol:=solve(polys,vars);
  472. sol := {{x1=-1,
  473. x2=u1/u2,
  474. x3=0,
  475. x4=-2,
  476. x5=( - u1**2 + 2*u1 - u2**2 - 1)/u2,
  477. x6=1,
  478. x7=u1**2 - 2*u1 + u2**2,
  479. x8=( - u1**3 + u1**2 - u1*u2**2 - u2**2)/u2,
  480. x9=0}}$
  481. P:=other_cc_point(B,sub(sol,c1),sub(sol,c2));
  482. p := {(u1**3 - u1**2 + u1*u2**2 + u1 + u2**2)/(u1**4 - 2*u1**3 + 2*u1**2*u2**2 +
  483. 3*u1**2 - 2*u1*u2**2 - 2*u1 + u2**4 + 3*u2**2 + 1),
  484. (u2*(u1**2 - 2*u1 + u2**2 + 1))/(u1**4 - 2*u1**3 + 2*u1**2*u2**2 + 3*u1**2 - 2*
  485. u1*u2**2 - 2*u1 + u2**4 + 3*u2**2 + 1)}$
  486. con:=point_on_circle(P,sub(sol,c3));
  487. con := 0$
  488. clear_ndg();
  489. {}$
  490. clear A,B,C,c1,c2,c3;
  491. % ##################
  492. % Simson's theorem
  493. % ##################
  494. % A constructive proof
  495. M:=Point(0,0);
  496. m := {0,0}$
  497. A:=choose_pc(M,r,u1);
  498. a := {(r*(u1**2 - 1))/(u1**2 + 1),(2*r*u1)/(u1**2 + 1)}$
  499. B:=choose_pc(M,r,u2);
  500. b := {(r*(u2**2 - 1))/(u2**2 + 1),(2*r*u2)/(u2**2 + 1)}$
  501. C:=choose_pc(M,r,u3);
  502. c := {(r*(u3**2 - 1))/(u3**2 + 1),(2*r*u3)/(u3**2 + 1)}$
  503. P:=choose_pc(M,r,u4);
  504. p := {(r*(u4**2 - 1))/(u4**2 + 1),(2*r*u4)/(u4**2 + 1)}$
  505. X:=pedalpoint(P,pp_line(A,B))$
  506. Y:=pedalpoint(P,pp_line(B,C))$
  507. Z:=pedalpoint(P,pp_line(A,C))$
  508. collinear(X,Y,Z);
  509. 0$
  510. clear_ndg();
  511. {}$
  512. clear(M,A,B,C,P,X,Y,Z);
  513. % Simson's theorem almost constructive
  514. clear_ndg();
  515. {}$
  516. A:=Point(0,0);
  517. a := {0,0}$
  518. B:=Point(u1,u2);
  519. b := {u1,u2}$
  520. C:=Point(u3,u4);
  521. c := {u3,u4}$
  522. P:=Point(u5,x1);
  523. p := {u5,x1}$
  524. X:=pedalpoint(P,pp_line(A,B));
  525. x := {(u1*(u1*u5 + u2*x1))/(u1**2 + u2**2),
  526. (u2*(u1*u5 + u2*x1))/(u1**2 + u2**2)}$
  527. Y:=pedalpoint(P,pp_line(B,C));
  528. y := {(u1**2*u5 - u1*u2*u4 + u1*u2*x1 - 2*u1*u3*u5 + u1*u4**2 - u1*u4*x1 + u2**2
  529. *u3 - u2*u3*u4 - u2*u3*x1 + u3**2*u5 + u3*u4*x1)/(u1**2 - 2*u1*u3 + u2**2 - 2*u2
  530. *u4 + u3**2 + u4**2),
  531. (u1**2*u4 - u1*u2*u3 + u1*u2*u5 - u1*u3*u4 - u1*u4*u5 + u2**2*x1 + u2*u3**2 - u2
  532. *u3*u5 - 2*u2*u4*x1 + u3*u4*u5 + u4**2*x1)/(u1**2 - 2*u1*u3 + u2**2 - 2*u2*u4 +
  533. u3**2 + u4**2)}$
  534. Z:=pedalpoint(P,pp_line(A,C));
  535. z := {(u3*(u3*u5 + u4*x1))/(u3**2 + u4**2),
  536. (u4*(u3*u5 + u4*x1))/(u3**2 + u4**2)}$
  537. poly:=p4_circle(A,B,C,P);
  538. poly := u1**2*u3*x1 - u1**2*u4*u5 - u1*u3**2*x1 - u1*u4**2*x1 + u1*u4*u5**2 + u1
  539. *u4*x1**2 + u2**2*u3*x1 - u2**2*u4*u5 + u2*u3**2*u5 - u2*u3*u5**2 - u2*u3*x1**2
  540. + u2*u4**2*u5$
  541. con:=collinear(X,Y,Z);
  542. con := ( - u1**4*u3*u4**2*x1 + u1**4*u4**3*u5 + 2*u1**3*u2*u3**2*u4*x1 - 2*u1**3
  543. *u2*u3*u4**2*u5 + u1**3*u3**2*u4**2*x1 + u1**3*u4**4*x1 - u1**3*u4**3*u5**2 - u1
  544. **3*u4**3*x1**2 - u1**2*u2**2*u3**3*x1 + u1**2*u2**2*u3**2*u4*u5 - u1**2*u2**2*
  545. u3*u4**2*x1 + u1**2*u2**2*u4**3*u5 - 2*u1**2*u2*u3**3*u4*x1 - u1**2*u2*u3**2*u4
  546. **2*u5 - 2*u1**2*u2*u3*u4**3*x1 + 3*u1**2*u2*u3*u4**2*u5**2 + 3*u1**2*u2*u3*u4**
  547. 2*x1**2 - u1**2*u2*u4**4*u5 + 2*u1*u2**3*u3**2*u4*x1 - 2*u1*u2**3*u3*u4**2*u5 +
  548. u1*u2**2*u3**4*x1 + 2*u1*u2**2*u3**3*u4*u5 + u1*u2**2*u3**2*u4**2*x1 - 3*u1*u2**
  549. 2*u3**2*u4*u5**2 - 3*u1*u2**2*u3**2*u4*x1**2 + 2*u1*u2**2*u3*u4**3*u5 - u2**4*u3
  550. **3*x1 + u2**4*u3**2*u4*u5 - u2**3*u3**4*u5 + u2**3*u3**3*u5**2 + u2**3*u3**3*x1
  551. **2 - u2**3*u3**2*u4**2*u5)/(u1**4*u3**2 + u1**4*u4**2 - 2*u1**3*u3**3 - 2*u1**3
  552. *u3*u4**2 + 2*u1**2*u2**2*u3**2 + 2*u1**2*u2**2*u4**2 - 2*u1**2*u2*u3**2*u4 - 2*
  553. u1**2*u2*u4**3 + u1**2*u3**4 + 2*u1**2*u3**2*u4**2 + u1**2*u4**4 - 2*u1*u2**2*u3
  554. **3 - 2*u1*u2**2*u3*u4**2 + u2**4*u3**2 + u2**4*u4**2 - 2*u2**3*u3**2*u4 - 2*u2
  555. **3*u4**3 + u2**2*u3**4 + 2*u2**2*u3**2*u4**2 + u2**2*u4**4)$
  556. remainder(num con,poly);
  557. 0$
  558. print_ndg();
  559. {u3**2 + u4**2,
  560. u1**2 - 2*u1*u3 + u2**2 - 2*u2*u4 + u3**2 + u4**2,
  561. u1**2 + u2**2}$
  562. % Equational proof, first version:
  563. M:=Point(0,0);
  564. m := {0,0}$
  565. A:=Point(0,1);
  566. a := {0,1}$
  567. B:=Point(u1,x1);
  568. b := {u1,x1}$
  569. C:=Point(u2,x2);
  570. c := {u2,x2}$
  571. P:=Point(u3,x3);
  572. p := {u3,x3}$
  573. X:=varpoint(A,B,x4);
  574. x := {u1*( - x4 + 1), - x1*x4 + x1 + x4}$
  575. Y:=varpoint(B,C,x5);
  576. y := {u1*x5 - u2*x5 + u2,x1*x5 - x2*x5 + x2}$
  577. Z:=varpoint(A,C,x6);
  578. z := {u2*( - x6 + 1), - x2*x6 + x2 + x6}$
  579. polys:={sqrdist(M,B)-1, sqrdist(M,C)-1, sqrdist(M,P)-1,
  580. orthogonal(pp_line(A,B),pp_line(P,X)),
  581. orthogonal(pp_line(A,C),pp_line(P,Z)),
  582. orthogonal(pp_line(B,C),pp_line(P,Y))};
  583. polys := {u1**2 + x1**2 - 1,
  584. u2**2 + x2**2 - 1,
  585. u3**2 + x3**2 - 1,
  586. - u1**2*x4 + u1**2 - u1*u3 - x1**2*x4 + x1**2 - x1*x3 + 2*x1*x4 - x1 + x3 - x4,
  587. - u2**2*x6 + u2**2 - u2*u3 - x2**2*x6 + x2**2 - x2*x3 + 2*x2*x6 - x2 + x3 - x6,
  588. - u1**2*x5 + 2*u1*u2*x5 - u1*u2 + u1*u3 - u2**2*x5 + u2**2 - u2*u3 - x1**2*x5 +
  589. 2*x1*x2*x5 - x1*x2 + x1*x3 - x2**2*x5 + x2**2 - x2*x3}$
  590. con:=collinear(X,Y,Z);
  591. con := u1*x2*x4*x5 - u1*x2*x4*x6 - u1*x2*x5*x6 + u1*x2*x6 - u1*x4*x5 + u1*x4*x6
  592. + u1*x5*x6 - u1*x6 - u2*x1*x4*x5 + u2*x1*x4*x6 + u2*x1*x5*x6 - u2*x1*x6 + u2*x4*
  593. x5 - u2*x4*x6 - u2*x5*x6 + u2*x6$
  594. vars:={x4,x5,x6,x1,x2,x3};
  595. vars := {x4,
  596. x5,
  597. x6,
  598. x1,
  599. x2,
  600. x3}$
  601. setring(vars,{},lex);
  602. {{x4,x5,x6,x1,x2,x3},{},lex,{1,1,1,1,1,1}}$
  603. setideal(polys,polys);
  604. {x1**2 + (u1**2 - 1),
  605. x2**2 + (u2**2 - 1),
  606. x3**2 + (u3**2 - 1),
  607. - x4*x1**2 + 2*x4*x1 - (u1**2 + 1)*x4 + x1**2 - x1*x3 - x1 + x3 + (u1**2 - u1*
  608. u3),
  609. - x6*x2**2 + 2*x6*x2 - (u2**2 + 1)*x6 + x2**2 - x2*x3 - x2 + x3 + (u2**2 - u2*
  610. u3),
  611. - x5*x1**2 + 2*x5*x1*x2 - x5*x2**2 - (u1**2 - 2*u1*u2 + u2**2)*x5 - x1*x2 + x1*
  612. x3 + x2**2 - x2*x3 - (u1*u2 - u1*u3 - u2**2 + u2*u3)}$
  613. con mod gbasis polys;
  614. 0$
  615. % Second version:
  616. A:=Point(0,0);
  617. a := {0,0}$
  618. B:=Point(1,0);
  619. b := {1,0}$
  620. C:=Point(u1,u2);
  621. c := {u1,u2}$
  622. P:=Point(u3,x1);
  623. p := {u3,x1}$
  624. X:=Point(x2,0);
  625. x := {x2,0}$
  626. % => on the line AB
  627. Y:=varpoint(B,C,x3);
  628. y := { - u1*x3 + u1 + x3,u2*( - x3 + 1)}$
  629. Z:=varpoint(A,C,x4);
  630. z := {u1*( - x4 + 1),u2*( - x4 + 1)}$
  631. polys:={orthogonal(pp_line(A,C),pp_line(P,Z)),
  632. orthogonal(pp_line(B,C),pp_line(P,Y)),
  633. orthogonal(pp_line(A,B),pp_line(P,X)),
  634. p4_circle(A,B,C,P)};
  635. polys := { - u1**2*x4 + u1**2 - u1*u3 - u2**2*x4 + u2**2 - u2*x1,
  636. - u1**2*x3 + u1**2 - u1*u3 + 2*u1*x3 - u1 - u2**2*x3 + u2**2 - u2*x1 + u3 - x3,
  637. - u3 + x2,
  638. - u1**2*x1 + u1*x1 - u2**2*x1 + u2*u3**2 - u2*u3 + u2*x1**2}$
  639. con:=collinear(X,Y,Z);
  640. con := u2*( - x2*x3 + x2*x4 - x3*x4 + x3)$
  641. vars:={x2,x3,x4,x1};
  642. vars := {x2,x3,x4,x1}$
  643. setring(vars,{},lex);
  644. {{x2,x3,x4,x1},{},lex,{1,1,1,1}}$
  645. con mod interreduce polys;
  646. 0$
  647. % The inverse theorem
  648. polys:={orthogonal(pp_line(A,C),pp_line(P,Z)),
  649. orthogonal(pp_line(B,C),pp_line(P,Y)),
  650. orthogonal(pp_line(A,B),pp_line(P,X)),
  651. collinear(X,Y,Z)};
  652. polys := { - u1**2*x4 + u1**2 - u1*u3 - u2**2*x4 + u2**2 - u2*x1,
  653. - u1**2*x3 + u1**2 - u1*u3 + 2*u1*x3 - u1 - u2**2*x3 + u2**2 - u2*x1 + u3 - x3,
  654. - u3 + x2,
  655. u2*( - x2*x3 + x2*x4 - x3*x4 + x3)}$
  656. con:=p4_circle(A,B,C,P);
  657. con := - u1**2*x1 + u1*x1 - u2**2*x1 + u2*u3**2 - u2*u3 + u2*x1**2$
  658. con mod interreduce polys;
  659. 0$
  660. clear_ndg();
  661. {}$
  662. clear(M,A,B,C,P,Y,Z);
  663. % ########################
  664. % The butterfly theorem
  665. % ########################
  666. % An equational proof with groebner factorizer and constraints.
  667. P:=Point(0,0);
  668. p := {0,0}$
  669. O:=Point(u1,0);
  670. o := {u1,0}$
  671. A:=Point(u2,u3);
  672. a := {u2,u3}$
  673. B:=Point(u4,x1);
  674. b := {u4,x1}$
  675. C:=Point(x2,x3);
  676. c := {x2,x3}$
  677. D:=Point(x4,x5);
  678. d := {x4,x5}$
  679. F:=Point(0,x6);
  680. f := {0,x6}$
  681. G:=Point(0,x7);
  682. g := {0,x7}$
  683. polys:={sqrdist(O,B)-sqrdist(O,A),
  684. sqrdist(O,C)-sqrdist(O,A),
  685. sqrdist(O,D)-sqrdist(O,A),
  686. point_on_line(P,pp_line(A,C)),
  687. point_on_line(P,pp_line(B,D)),
  688. point_on_line(F,pp_line(A,D)),
  689. point_on_line(G,pp_line(B,C))
  690. };
  691. polys := {2*u1*u2 - 2*u1*u4 - u2**2 - u3**2 + u4**2 + x1**2,
  692. 2*u1*u2 - 2*u1*x2 - u2**2 - u3**2 + x2**2 + x3**2,
  693. 2*u1*u2 - 2*u1*x4 - u2**2 - u3**2 + x4**2 + x5**2,
  694. - u2*x3 + u3*x2,
  695. - u4*x5 + x1*x4,
  696. - u2*x5 + u2*x6 + u3*x4 - x4*x6,
  697. - u4*x3 + u4*x7 + x1*x2 - x2*x7}$
  698. con:=num sqrdist(P,midpoint(F,G));
  699. con := x6**2 + 2*x6*x7 + x7**2$
  700. vars:={x6,x7,x3,x5,x1,x2,x4};
  701. vars := {x6,
  702. x7,
  703. x3,
  704. x5,
  705. x1,
  706. x2,
  707. x4}$
  708. setring(vars,{},lex);
  709. {{x6,x7,x3,x5,x1,x2,x4},{},lex,{1,1,1,1,1,1,1}}$
  710. sol:=groebfactor(polys,{sqrdist(A,C),sqrdist(B,D)});
  711. sol := {{x1**2 + (2*u1*u2 - 2*u1*u4 - u2**2 - u3**2 + u4**2),
  712. (u2**2 + u3**2)*x3 - (2*u1*u2*u3 - u2**2*u3 - u3**3),
  713. (2*u1*u2 - 2*u1*u4 - u2**2 - u3**2)*x5 + (2*u1*u2 - u2**2 - u3**2)*x1,
  714. (2*u1*u2 - 2*u1*u4 - u2**2 - u3**2)*x4 + (2*u1*u2*u4 - u2**2*u4 - u3**2*u4),
  715. (u2**2 + u3**2)*x2 - (2*u1*u2**2 - u2**3 - u2*u3**2),
  716. (2*u1*u2**2 - u2**3 - u2**2*u4 - u2*u3**2 - u3**2*u4)*x7 - (2*u1*u2**2 - u2**3 -
  717. u2*u3**2)*x1 + (2*u1*u2*u3*u4 - u2**2*u3*u4 - u3**3*u4),
  718. (2*u1*u2**2 - u2**3 - u2**2*u4 - u2*u3**2 - u3**2*u4)*x6 + (2*u1*u2**2 - u2**3 -
  719. u2*u3**2)*x1 - (2*u1*u2*u3*u4 - u2**2*u3*u4 - u3**3*u4)}}$
  720. for each u in sol collect con mod u;
  721. {0}$
  722. % A constructive proof
  723. on gcd;
  724. O:=Point(0,0);
  725. o := {0,0}$
  726. A:=Point(1,0);
  727. a := {1,0}$
  728. B:=choose_pc(O,1,u1);
  729. b := {(u1**2 - 1)/(u1**2 + 1),(2*u1)/(u1**2 + 1)}$
  730. C:=choose_pc(O,1,u2);
  731. c := {(u2**2 - 1)/(u2**2 + 1),(2*u2)/(u2**2 + 1)}$
  732. D:=choose_pc(O,1,u3);
  733. d := {(u3**2 - 1)/(u3**2 + 1),(2*u3)/(u3**2 + 1)}$
  734. P:=intersection_point(pp_line(A,C),pp_line(B,D));
  735. p := {(u1*u2 - u1*u3 + u2*u3 - 1)/(u1*u2 - u1*u3 + u2*u3 + 1),
  736. (2*u2)/(u1*u2 - u1*u3 + u2*u3 + 1)}$
  737. h:=lot(P,pp_line(O,P));
  738. h := {( - u1*u2 + u1*u3 - u2*u3 + 1)/(u1*u2 - u1*u3 + u2*u3 + 1),
  739. ( - 2*u2)/(u1*u2 - u1*u3 + u2*u3 + 1),
  740. (u1**2*u2**2 - 2*u1**2*u2*u3 + u1**2*u3**2 + 2*u1*u2**2*u3 - 2*u1*u2*u3**2 - 2*
  741. u1*u2 + 2*u1*u3 + u2**2*u3**2 + 4*u2**2 - 2*u2*u3 + 1)/(u1**2*u2**2 - 2*u1**2*u2
  742. *u3 + u1**2*u3**2 + 2*u1*u2**2*u3 - 2*u1*u2*u3**2 + 2*u1*u2 - 2*u1*u3 + u2**2*u3
  743. **2 + 2*u2*u3 + 1)}$
  744. F:=intersection_point(h,pp_line(A,D));
  745. f := {(u1**2*u2**2 - 2*u1**2*u2*u3 + u1**2*u3**2 - 2*u1*u2 + 2*u1*u3 - u2**2*u3
  746. **2 + 4*u2**2 - 4*u2*u3 + 1)/(u1**2*u2**2 - 2*u1**2*u2*u3 + u1**2*u3**2 - u2**2*
  747. u3**2 - 2*u2*u3 - 1),
  748. (2*u3*(u1*u2 - u1*u3 - 2*u2**2 + u2*u3 - 1))/(u1**2*u2**2 - 2*u1**2*u2*u3 + u1**
  749. 2*u3**2 - u2**2*u3**2 - 2*u2*u3 - 1)}$
  750. G:=intersection_point(h,pp_line(B,C));
  751. g := {(u1**2*u2**2 - 2*u1**2*u2*u3 + u1**2*u3**2 - 2*u1*u2 + 2*u1*u3 - u2**2*u3
  752. **2 - 4*u2**2 + 4*u2*u3 + 1)/(u1**2*u2**2 - 2*u1**2*u2*u3 + u1**2*u3**2 - u2**2*
  753. u3**2 - 2*u2*u3 - 1),
  754. (2*(2*u1*u2**2 - 3*u1*u2*u3 + u1*u3**2 - u2*u3**2 - 2*u2 + u3))/(u1**2*u2**2 - 2
  755. *u1**2*u2*u3 + u1**2*u3**2 - u2**2*u3**2 - 2*u2*u3 - 1)}$
  756. con:=sqrdist(P,midpoint(F,G));
  757. con := 0$
  758. off gcd;
  759. clear_ndg();
  760. {}$
  761. clear(O,A,B,C,D,P,h,F,G);
  762. % ################################
  763. % Tangency of Feuerbach's circle
  764. % ################################
  765. A:=Point(0,0);
  766. a := {0,0}$
  767. B:=Point(2,0);
  768. b := {2,0}$
  769. C:=Point(u1,u2);
  770. c := {u1,u2}$
  771. M:=intersection_point(mp(A,B),mp(B,C));
  772. m := {1,(u1**2 - 2*u1 + u2**2)/(2*u2)}$
  773. H:=intersection_point(altitude(A,B,C),altitude(B,C,A));
  774. h := {u1,(u1*( - u1 + 2))/u2}$
  775. N:=midpoint(M,H);
  776. n := {(u1 + 1)/2,( - u1**2 + 2*u1 + u2**2)/(4*u2)}$
  777. c1:=c1_circle(N,sqrdist(N,midpoint(A,B)));
  778. c1 := {1, - (u1 + 1),(u1**2 - 2*u1 - u2**2)/(2*u2),u1}$
  779. % Feuerbach's circle
  780. P:=Point(x1,x2);
  781. p := {x1,x2}$
  782. % => x2 is the radius of the inscribed circle.
  783. polys:={point_on_bisector(P,A,B,C), point_on_bisector(P,B,C,A)};
  784. polys := {2*( - 2*u1*x1*x2 + 4*u1*x2 + u2*x1**2 - 4*u2*x1 - u2*x2**2 + 4*u2 + 4*
  785. x1*x2 - 8*x2),
  786. 2*( - u1**3*x2 + u1**2*u2*x1 - u1**2*u2 + u1**2*x1*x2 + 2*u1**2*x2 - u1*u2**2*x2
  787. - u1*u2*x1**2 + u1*u2*x2**2 - 2*u1*x1*x2 + u2**3*x1 - u2**3 - u2**2*x1*x2 + 2*
  788. u2**2*x2 + u2*x1**2 - u2*x2**2)}$
  789. con:=cc_tangent(c1_circle(P,x2^2),c1);
  790. con := (4*( - u1**3*x1*x2 + u1**3*x2 + u1**2*u2*x1**2 - 2*u1**2*u2*x1 - u1**2*u2
  791. *x2**2 + u1**2*u2 + u1**2*x1**2*x2 + u1**2*x1*x2 - 2*u1**2*x2 + u1*u2**2*x1*x2 -
  792. u1*u2**2*x2 - 2*u1*u2*x1**3 + 4*u1*u2*x1**2 - 2*u1*u2*x1 + 2*u1*u2*x2**2 - 2*u1
  793. *x1**2*x2 + 2*u1*x1*x2 - u2**2*x1**2*x2 + u2**2*x1*x2 + u2*x1**4 - 2*u2*x1**3 +
  794. u2*x1**2 - u2*x2**2))/u2$
  795. vars:={x1,x2};
  796. vars := {x1,x2}$
  797. setring(vars,{},lex);
  798. {{x1,x2},{},lex,{1,1}}$
  799. setideal(polys,polys);
  800. {(2*u2)*x1**2 - (4*u1 - 8)*x1*x2 - (8*u2)*x1 - (2*u2)*x2**2 + (8*u1 - 16)*x2 + 8
  801. *u2,
  802. - (2*u1*u2 - 2*u2)*x1**2 + (2*u1**2 - 4*u1 - 2*u2**2)*x1*x2 + (2*u1**2*u2 + 2*
  803. u2**3)*x1 + (2*u1*u2 - 2*u2)*x2**2 - (2*u1**3 - 4*u1**2 + 2*u1*u2**2 - 4*u2**2)*
  804. x2 - (2*u1**2*u2 + 2*u2**3)}$
  805. num con mod gbasis polys;
  806. 0$
  807. % Now let P be the incenter of the triangle ABH
  808. polys1:={point_on_bisector(P,A,B,H), point_on_bisector(P,B,H,A)};
  809. polys1 := {(2*( - u1**2*x1**2 + 4*u1**2*x1 + u1**2*x2**2 - 4*u1**2 - 2*u1*u2*x1*
  810. x2 + 4*u1*u2*x2 + 2*u1*x1**2 - 8*u1*x1 - 2*u1*x2**2 + 8*u1 + 4*u2*x1*x2 - 8*u2*
  811. x2))/u2,
  812. (2*u1*( - u1**5*x1 + u1**5 - u1**4*u2*x2 + 6*u1**4*x1 - 6*u1**4 - u1**3*u2**2*x1
  813. + u1**3*u2**2 - u1**3*u2*x1*x2 + 6*u1**3*u2*x2 - 12*u1**3*x1 + 12*u1**3 - u1**2
  814. *u2**3*x2 + u1**2*u2**2*x1**2 + 2*u1**2*u2**2*x1 - u1**2*u2**2*x2**2 - 2*u1**2*
  815. u2**2 + 4*u1**2*u2*x1*x2 - 12*u1**2*u2*x2 + 8*u1**2*x1 - 8*u1**2 + u1*u2**3*x1*
  816. x2 + 2*u1*u2**3*x2 - 3*u1*u2**2*x1**2 + 3*u1*u2**2*x2**2 - 4*u1*u2*x1*x2 + 8*u1*
  817. u2*x2 - 2*u2**3*x1*x2 + 2*u2**2*x1**2 - 2*u2**2*x2**2))/u2**3}$
  818. con1:=cc_tangent(c1_circle(P,x2^2),c1);
  819. con1 := (4*( - u1**3*x1*x2 + u1**3*x2 + u1**2*u2*x1**2 - 2*u1**2*u2*x1 - u1**2*
  820. u2*x2**2 + u1**2*u2 + u1**2*x1**2*x2 + u1**2*x1*x2 - 2*u1**2*x2 + u1*u2**2*x1*x2
  821. - u1*u2**2*x2 - 2*u1*u2*x1**3 + 4*u1*u2*x1**2 - 2*u1*u2*x1 + 2*u1*u2*x2**2 - 2*
  822. u1*x1**2*x2 + 2*u1*x1*x2 - u2**2*x1**2*x2 + u2**2*x1*x2 + u2*x1**4 - 2*u2*x1**3
  823. + u2*x1**2 - u2*x2**2))/u2$
  824. setideal(polys1,polys1);
  825. { - (2*u1**2 - 4*u1)*x1**2 - (4*u1*u2 - 8*u2)*x1*x2 + (8*u1**2 - 16*u1)*x1 + (2*
  826. u1**2 - 4*u1)*x2**2 + (8*u1*u2 - 16*u2)*x2 - (8*u1**2 - 16*u1),
  827. (2*u1**3*u2**2 - 6*u1**2*u2**2 + 4*u1*u2**2)*x1**2 - (2*u1**4*u2 - 8*u1**3*u2 -
  828. 2*u1**2*u2**3 + 8*u1**2*u2 + 4*u1*u2**3)*x1*x2 - (2*u1**6 - 12*u1**5 + 2*u1**4*
  829. u2**2 + 24*u1**4 - 4*u1**3*u2**2 - 16*u1**3)*x1 - (2*u1**3*u2**2 - 6*u1**2*u2**2
  830. + 4*u1*u2**2)*x2**2 - (2*u1**5*u2 - 12*u1**4*u2 + 2*u1**3*u2**3 + 24*u1**3*u2 -
  831. 4*u1**2*u2**3 - 16*u1**2*u2)*x2 + (2*u1**6 - 12*u1**5 + 2*u1**4*u2**2 + 24*u1**
  832. 4 - 4*u1**3*u2**2 - 16*u1**3)}$
  833. num con1 mod gbasis polys1;
  834. 0$
  835. clear_ndg();
  836. {}$
  837. clear A,B,C,P,M,N,H,c1;
  838. % #############################
  839. % Solutions to the exercises
  840. % #############################
  841. % 1)
  842. A:=Point(0,0);
  843. a := {0,0}$
  844. B:=Point(1,0);
  845. b := {1,0}$
  846. C:=Point(1,1);
  847. c := {1,1}$
  848. D:=Point(0,1);
  849. d := {0,1}$
  850. P:=Point(x1,x2);
  851. p := {x1,x2}$
  852. Q:=Point(x3,1);
  853. q := {x3,1}$
  854. polys:={point_on_line(P,par(C,pp_line(B,D))),
  855. sqrdist(B,D)-sqrdist(B,P),
  856. point_on_line(Q,pp_line(B,P))};
  857. polys := {x1 + x2 - 2,
  858. - x1**2 + 2*x1 - x2**2 + 1,
  859. - x1 + x2*x3 - x2 + 1}$
  860. con:=sqrdist(D,P)-sqrdist(D,Q);
  861. con := x1**2 + x2**2 - 2*x2 - x3**2 + 1$
  862. setring({x1,x2,x3},{},lex);
  863. {{x1,x2,x3},{},lex,{1,1,1}}$
  864. setideal(polys,polys);
  865. {x1 + x2 - 2,
  866. - x1**2 + 2*x1 - x2**2 + 1,
  867. - x1 + x2*x3 - x2 + 1}$
  868. con mod gbasis polys;
  869. 0$
  870. clear_ndg();
  871. {}$
  872. clear(A,B,C,D,P,Q);
  873. % 2)
  874. A:=Point(u1,0);
  875. a := {u1,0}$
  876. B:=Point(u2,0);
  877. b := {u2,0}$
  878. C:=Point(0,u3);
  879. c := {0,u3}$
  880. Q:=Point(0,0);
  881. q := {0,0}$
  882. % the pedal point on AB
  883. R:=pedalpoint(B,pp_line(A,C));
  884. r := {(u1*(u1*u2 + u3**2))/(u1**2 + u3**2),
  885. (u1*u3*(u1 - u2))/(u1**2 + u3**2)}$
  886. P:=pedalpoint(A,pp_line(B,C));
  887. p := {(u2*(u1*u2 + u3**2))/(u2**2 + u3**2),
  888. (u2*u3*( - u1 + u2))/(u2**2 + u3**2)}$
  889. con1:=point_on_bisector(C,P,Q,R);
  890. con1 := 0$
  891. con2:=angle_sum(p3_angle(P,Q,C),p3_angle(R,Q,C));
  892. con2 := 0$
  893. clear_ndg();
  894. {}$
  895. clear(A,B,C,P,Q,R);
  896. % 3)
  897. A:=Point(u1,0);
  898. a := {u1,0}$
  899. B:=Point(u2,0);
  900. b := {u2,0}$
  901. C:=Point(0,u3);
  902. c := {0,u3}$
  903. P:=pedalpoint(A,pp_line(B,C));
  904. p := {(u2*(u1*u2 + u3**2))/(u2**2 + u3**2),
  905. (u2*u3*( - u1 + u2))/(u2**2 + u3**2)}$
  906. Q:=pedalpoint(B,pp_line(A,C));
  907. q := {(u1*(u1*u2 + u3**2))/(u1**2 + u3**2),
  908. (u1*u3*(u1 - u2))/(u1**2 + u3**2)}$
  909. R:=pedalpoint(C,pp_line(A,B));
  910. r := {0,0}$
  911. P1:=pedalpoint(P,pp_line(A,B));
  912. p1 := {(u2*(u1*u2 + u3**2))/(u2**2 + u3**2),0}$
  913. P2:=pedalpoint(P,pp_line(A,C));
  914. p2 := {(u1*(u1**2*u2**2 + 2*u1*u2*u3**2 + u3**4))/(u1**2*u2**2 + u1**2*u3**2 +
  915. u2**2*u3**2 + u3**4),
  916. (u3**3*(u1**2 - 2*u1*u2 + u2**2))/(u1**2*u2**2 + u1**2*u3**2 + u2**2*u3**2 + u3
  917. **4)}$
  918. Q1:=pedalpoint(Q,pp_line(A,B));
  919. q1 := {(u1*(u1*u2 + u3**2))/(u1**2 + u3**2),0}$
  920. Q2:=pedalpoint(Q,pp_line(B,C));
  921. q2 := {(u2*(u1**2*u2**2 + 2*u1*u2*u3**2 + u3**4))/(u1**2*u2**2 + u1**2*u3**2 +
  922. u2**2*u3**2 + u3**4),
  923. (u3**3*(u1**2 - 2*u1*u2 + u2**2))/(u1**2*u2**2 + u1**2*u3**2 + u2**2*u3**2 + u3
  924. **4)}$
  925. R1:=pedalpoint(R,pp_line(A,C));
  926. r1 := {(u1*u3**2)/(u1**2 + u3**2),(u1**2*u3)/(u1**2 + u3**2)}$
  927. R2:=pedalpoint(R,pp_line(B,C));
  928. r2 := {(u2*u3**2)/(u2**2 + u3**2),(u2**2*u3)/(u2**2 + u3**2)}$
  929. con:=for each X in {Q2,R1,R2} collect p4_circle(P1,P2,Q1,X);
  930. con := {0,0,0}$
  931. clear_ndg();
  932. {}$
  933. clear(O,A,B,C,P,Q,R,P1,P2,Q1,Q2,R1,R2);
  934. % 4)
  935. A:=Point(u1,0);
  936. a := {u1,0}$
  937. B:=Point(u2,0);
  938. b := {u2,0}$
  939. C:=Point(0,u3);
  940. c := {0,u3}$
  941. % => Pedalpoint from C is (0,0)
  942. M:=intersection_point(mp(A,B),mp(B,C));
  943. m := {(u1 + u2)/2,(u1*u2 + u3**2)/(2*u3)}$
  944. % Prove (2*h_c*R = a*b)^2
  945. con:=4*u3^2*sqrdist(M,A)-sqrdist(C,B)*sqrdist(A,C);
  946. con := 0$
  947. clear_ndg();
  948. {}$
  949. clear(A,B,C,M);
  950. % 5. A solution of constructive type.
  951. on gcd;
  952. O:=Point(0,u1);
  953. o := {0,u1}$
  954. A:=Point(0,0);
  955. a := {0,0}$
  956. % hence k has radius u1.
  957. B:=Point(u2,0);
  958. b := {u2,0}$
  959. M:=midpoint(A,B);
  960. m := {u2/2,0}$
  961. D:=choose_pc(O,u1,u3);
  962. d := {(u1*(u3**2 - 1))/(u3**2 + 1),(u1*(u3**2 + 2*u3 + 1))/(u3**2 + 1)}$
  963. k:=c1_circle(O,u1^2);
  964. k := {1,0, - 2*u1,0}$
  965. C:=other_cl_point(D,k,pp_line(M,D));
  966. c := {(u1*u2*(4*u1*u3**2 + 8*u1*u3 + 4*u1 - u2*u3**2 + u2))/(8*u1**2*u3**2 + 16*
  967. u1**2*u3 + 8*u1**2 - 4*u1*u2*u3**2 + 4*u1*u2 + u2**2*u3**2 + u2**2),
  968. (u1*u2**2*(u3**2 + 2*u3 + 1))/(8*u1**2*u3**2 + 16*u1**2*u3 + 8*u1**2 - 4*u1*u2*
  969. u3**2 + 4*u1*u2 + u2**2*u3**2 + u2**2)}$
  970. Eh:=other_cl_point(D,k,pp_line(B,D));
  971. eh := {(u1*u2*(2*u1*u3**2 + 4*u1*u3 + 2*u1 - u2*u3**2 + u2))/(2*u1**2*u3**2 + 4*
  972. u1**2*u3 + 2*u1**2 - 2*u1*u2*u3**2 + 2*u1*u2 + u2**2*u3**2 + u2**2),
  973. (u1*u2**2*(u3**2 + 2*u3 + 1))/(2*u1**2*u3**2 + 4*u1**2*u3 + 2*u1**2 - 2*u1*u2*u3
  974. **2 + 2*u1*u2 + u2**2*u3**2 + u2**2)}$
  975. F:=other_cl_point(C,k,pp_line(B,C));
  976. f := {(u1*u2*( - 2*u1*u3**2 - 4*u1*u3 - 2*u1 + u2*u3**2 - u2))/(2*u1**2*u3**2 +
  977. 4*u1**2*u3 + 2*u1**2 - 2*u1*u2*u3**2 + 2*u1*u2 + u2**2*u3**2 + u2**2),
  978. (u1*u2**2*(u3**2 + 2*u3 + 1))/(2*u1**2*u3**2 + 4*u1**2*u3 + 2*u1**2 - 2*u1*u2*u3
  979. **2 + 2*u1*u2 + u2**2*u3**2 + u2**2)}$
  980. con:=parallel(pp_line(A,B),pp_line(Eh,F));
  981. con := 0$
  982. off gcd;
  983. clear_ndg();
  984. {}$
  985. clear(O,A,B,C,D,Eh,F,M,k);
  986. % 6)
  987. Z:=Point(0,0);
  988. z := {0,0}$
  989. X:=Point(0,1);
  990. x := {0,1}$
  991. Y:=Point(0,-1);
  992. y := {0,-1}$
  993. B:=Point(u1,0);
  994. b := {u1,0}$
  995. C:=Point(u2,0);
  996. c := {u2,0}$
  997. P:=Point(0,u3);
  998. p := {0,u3}$
  999. M:=Point(x1,x2);
  1000. m := {x1,x2}$
  1001. N:=Point(x3,x4);
  1002. n := {x3,x4}$
  1003. A:=Point(x5,0);
  1004. a := {x5,0}$
  1005. D:=Point(x6,0);
  1006. d := {x6,0}$
  1007. polys:={p4_circle(X,Y,B,N), p4_circle(X,Y,C,M),
  1008. p4_circle(X,Y,B,D), p4_circle(X,Y,C,A),
  1009. collinear(B,P,N), collinear(C,P,M)};
  1010. polys := {2*( - u1**2*x3 + u1*x3**2 + u1*x4**2 - u1 + x3),
  1011. 2*( - u2**2*x1 + u2*x1**2 + u2*x2**2 - u2 + x1),
  1012. 2*( - u1**2*x6 + u1*x6**2 - u1 + x6),
  1013. 2*( - u2**2*x5 + u2*x5**2 - u2 + x5),
  1014. u1*u3 - u1*x4 - u3*x3,
  1015. u2*u3 - u2*x2 - u3*x1}$
  1016. con:=concurrent(pp_line(A,M),pp_line(D,N),pp_line(X,Y));
  1017. con := 2*( - x1*x4*x6 + x2*x3*x5 - x2*x5*x6 + x4*x5*x6)$
  1018. vars:={x1,x2,x3,x4,x5,x6};
  1019. vars := {x1,
  1020. x2,
  1021. x3,
  1022. x4,
  1023. x5,
  1024. x6}$
  1025. setring(vars,{},lex);
  1026. {{x1,x2,x3,x4,x5,x6},{},lex,{1,1,1,1,1,1}}$
  1027. res:=groebfactor(polys,{x5-u2,x1-u2,x6-u1,x3-u1});
  1028. res := {{u1*x6 + 1,
  1029. (u2**2 + u3**2)*x2 - (u2**2*u3 + u3),
  1030. (u2**2 + u3**2)*x1 - (u2*u3**2 - u2),
  1031. (u1**2 + u3**2)*x4 - (u1**2*u3 + u3),
  1032. (u1**2 + u3**2)*x3 - (u1*u3**2 - u1),
  1033. u2*x5 + 1}}$
  1034. % constraints A\neq C, M\neq C, D\neq B, N\neq B
  1035. for each u in res collect con mod u;
  1036. {0}$
  1037. clear_ndg();
  1038. {}$
  1039. clear(Z,X,Y,B,C,P,M,N,A,D);
  1040. % 7)
  1041. M:=Point(0,0);
  1042. m := {0,0}$
  1043. A:=Point(0,u1);
  1044. a := {0,u1}$
  1045. B:=Point(-1,0);
  1046. b := {-1,0}$
  1047. C:=Point(1,0);
  1048. c := {1,0}$
  1049. Eh:=varpoint(A,B,x1);
  1050. eh := {x1 - 1,u1*x1}$
  1051. F:=varpoint(A,C,x2);
  1052. f := { - x2 + 1,u1*x2}$
  1053. O:=intersection_point(pp_line(A,M),lot(B,pp_line(A,B)));
  1054. o := {0,( - 1)/u1}$
  1055. Q:=intersection_point(pp_line(Eh,F),pp_line(B,C));
  1056. q := {( - 2*x1*x2 + x1 + x2)/(x1 - x2),0}$
  1057. con1:=num orthogonal(pp_line(O,Q),pp_line(Eh,Q));
  1058. con1 := 2*x1*(x1**2*x2 - x1**2 + x1*x2**2 - 2*x1*x2 + x1 - x2**2 + x2)$
  1059. con2:=num sqrdist(Q,midpoint(Eh,F));
  1060. con2 := u1**2*x1**4 - 2*u1**2*x1**2*x2**2 + u1**2*x2**4 + x1**4 + 4*x1**3*x2 - 4
  1061. *x1**3 + 6*x1**2*x2**2 - 12*x1**2*x2 + 4*x1**2 + 4*x1*x2**3 - 12*x1*x2**2 + 8*x1
  1062. *x2 + x2**4 - 4*x2**3 + 4*x2**2$
  1063. vars:={x1,x2};
  1064. vars := {x1,x2}$
  1065. setring(vars,{},lex);
  1066. {{x1,x2},{},lex,{1,1}}$
  1067. p1:=groebfactor({con1},{x1-1,x2-1,x1,x2});
  1068. p1 := {{x1 + x2}}$
  1069. p2:=groebfactor({con2},{x1-1,x2-1,x1,x2});
  1070. p2 := {{x1 + x2},
  1071. {(u1**2 + 1)*x1**2 - (2*u1**2 - 2)*x1*x2 - 4*x1 + (u1**2 + 1)*x2**2 - 4*x2 + 4}}
  1072. $
  1073. % constraint A,C\neq Eh, B,C\neq F
  1074. for each u in p1 collect con2 mod u;
  1075. {0}$
  1076. for each u in p2 collect con1 mod u;
  1077. {0,
  1078. (2*(5*u1**4*x1*x2**3 - 8*u1**4*x1*x2**2 + 3*u1**4*x1*x2 - 3*u1**4*x2**4 + 4*u1**
  1079. 4*x2**3 - u1**4*x2**2 - 10*u1**2*x1*x2**3 + 32*u1**2*x1*x2**2 - 30*u1**2*x1*x2 +
  1080. 8*u1**2*x1 - 2*u1**2*x2**4 + 12*u1**2*x2**3 - 26*u1**2*x2**2 + 20*u1**2*x2 - 4*
  1081. u1**2 + x1*x2**3 - 8*x1*x2**2 + 15*x1*x2 - 8*x1 + x2**4 - 8*x2**3 + 23*x2**2 -
  1082. 28*x2 + 12))/(u1**4 + 2*u1**2 + 1)}$
  1083. % Note that the second component of p2 has no relevant *real* roots,
  1084. % since it factors as u1^2 * (x1 - x2)^2 + (x1 + x2 -2)^2 :
  1085. u1^2 * (x1 - x2)^2 + (x1 + x2 -2)^2 mod second p2;
  1086. 0$
  1087. clear_ndg();
  1088. {}$
  1089. clear(M,A,B,C,O,Eh,F,Q);
  1090. % 8)
  1091. on gcd;
  1092. A:=Point(u1,0);
  1093. a := {u1,0}$
  1094. B:=Point(u2,0);
  1095. b := {u2,0}$
  1096. l1:=pp_line(A,B);
  1097. l1 := {0,u1 - u2,0}$
  1098. M:=Point(0,u3);
  1099. m := {0,u3}$
  1100. % the incenter, hence u3 = incircle radius
  1101. C:=intersection_point(symline(l1,pp_line(A,M)),
  1102. symline(l1,pp_line(B,M)));
  1103. c := {(u3**2*(u1 + u2))/(u1*u2 + u3**2),
  1104. (2*u1*u2*u3)/(u1*u2 + u3**2)}$
  1105. N:=intersection_point(mp(A,B),mp(B,C));
  1106. n := {(u1 + u2)/2,
  1107. (u1**2*u2**2 - u1**2*u3**2 + 4*u1*u2*u3**2 - u2**2*u3**2 + u3**4)/(4*u3*(u1*u2 +
  1108. u3**2))}$
  1109. % the outcenter
  1110. sqr_rad:=sqrdist(A,N);
  1111. sqr_rad := (u1**4*u2**4 + 2*u1**4*u2**2*u3**2 + u1**4*u3**4 + 2*u1**2*u2**4*u3**
  1112. 2 + 4*u1**2*u2**2*u3**4 + 2*u1**2*u3**6 + u2**4*u3**4 + 2*u2**2*u3**6 + u3**8)/(
  1113. 16*u3**2*(u1**2*u2**2 + 2*u1*u2*u3**2 + u3**4))$
  1114. % the outcircle sqradius.
  1115. (sqr_rad-sqrdist(M,N))^2-4*u3^2*sqr_rad;
  1116. 0$
  1117. off gcd;
  1118. clear_ndg();
  1119. {}$
  1120. clear A,B,C,M,N,l1,sqr_rad;
  1121. % 9)
  1122. on gcd;
  1123. A:=Point(0,0);
  1124. a := {0,0}$
  1125. B:=Point(1,0);
  1126. b := {1,0}$
  1127. M:=Point(u1,0);
  1128. m := {u1,0}$
  1129. C:=Point(u1,u1);
  1130. c := {u1,u1}$
  1131. F:=Point(u1,1-u1);
  1132. f := {u1, - u1 + 1}$
  1133. c1:=red_hom_coords p3_circle(A,M,C);
  1134. c1 := {1, - u1, - u1,0}$
  1135. c2:=red_hom_coords p3_circle(B,M,F);
  1136. c2 := {-1,u1 + 1, - u1 + 1, - u1}$
  1137. N:=other_cc_point(M,c1,c2);
  1138. n := {u1**2/(2*u1**2 - 2*u1 + 1),(u1*( - u1 + 1))/(2*u1**2 - 2*u1 + 1)}$
  1139. point_on_line(N,pp_line(A,F));
  1140. 0$
  1141. point_on_line(N,pp_line(B,C));
  1142. 0$
  1143. l1:=red_hom_coords pp_line(M,N);
  1144. l1 := {-1,2*u1 - 1,u1}$
  1145. l2:=sub(u1=u2,l1);
  1146. l2 := {-1,2*u2 - 1,u2}$
  1147. intersection_point(l1,l2);
  1148. {1/2,( - 1)/2}$
  1149. % = (1/2,-1/2)
  1150. off gcd;
  1151. clear_ndg();
  1152. {}$
  1153. clear A,B,C,F,M,N,c1,c2,l1,l2;
  1154. % ####################
  1155. % Some more examples
  1156. % ####################
  1157. % Origin: D. Wang at
  1158. % http://cosmos.imag.fr/ATINF/Dongming.Wang/geother.html
  1159. % --------------------------
  1160. % Given triangle ABC, H orthocenter, O circumcenter, A1 circumcenter
  1161. % of BHC, B1 circumcenter of AHC.
  1162. %
  1163. % Claim: OH, AA1, BB1 are concurrent.
  1164. % --------------------------
  1165. A:=Point(u1,0);
  1166. a := {u1,0}$
  1167. B:=Point(u2,0);
  1168. b := {u2,0}$
  1169. C:=Point(0,u3);
  1170. c := {0,u3}$
  1171. H:=intersection_point(altitude(C,A,B),altitude(A,B,C));
  1172. h := {0,( - u1*u2)/u3}$
  1173. O:=circle_center(p3_circle(A,B,C));
  1174. o := {(u1 + u2)/2,(u1*u2 + u3**2)/(2*u3)}$
  1175. A1:=circle_center(p3_circle(H,B,C));
  1176. a1 := {( - u1 + u2)/2,( - u1*u2 + u3**2)/(2*u3)}$
  1177. B1:=circle_center(p3_circle(H,A,C));
  1178. b1 := {(u1 - u2)/2,( - u1*u2 + u3**2)/(2*u3)}$
  1179. con:=concurrent(pp_line(O,H),pp_line(A,A1),pp_line(B,B1));
  1180. con := 0$
  1181. end;
  1182. Time for test: 114295 ms, plus GC time: 5438 ms