geometry.rlg 42 KB

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