Rachunek symboliczny w Python#
Jedną z podstawowych cech obliczeń w SageMath jest możliwość przeprowadzania w pełni symbolicznych rozumowań. Najlepiej wytłumaczyć to na przykładzie.
Przykład 1#
Wyznacz ostatnia cyfrę liczby całkowitej \(A_n\), gdzie \((1+\sqrt{2})^n = A_n+B_n \sqrt{2}\) dla \(n=1000\). Odpowiedź 7
print(((1+sqrt(2))^1000).expand())
21093096734545788527500836634727099588489384390319004814017810623293211815789209911283798336840541227810827362247961462076340236731742628764087168306758128066643738616268857975982438181087665615915626282432004505944399554607844270641892800758687636009968274277222295140088568054131815535180156183128363609909859421735474877635959333893583537947135921530940258496573995974651586025272*sqrt(2) + 29830143474442298001129795174793040151744428847802742169166276817001664681121782120915351803428453748118551925116779805767489527890968849645306147349089263359830312589220741815894109864844474418807750002082487853475867434347137762094092099359890863256272576723592614162865351044825595779184368879043532947321306433685532982297015411679683242382695050673704586852323753879398408655937
Przykład 2#
Liczby Fibonacciego to ciąg \((F_n)_{n\in\mathbb{N}}\) nieujemnych liczb całkowitych określonych wzorem
\(F_{n}=\left\{\begin{array}{ll} n, & n=0,1\\ F_{n-1}+F_{n-2}, & n\geq 2 \end{array} \right.\)
Fakt: liczby Fibonacciego można wyznaczyć wzorem
\[
F_n = \frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n)
\]
Mając dostęp do formuły Bineta, możemy z łatwością weryfikować pewne tożsamości spełniane przez liczby Fibonacciego, np. tożsamość Cassiniego:
\[
F_n^2 - F_{n+1}F_{n-1}=(-1)^{n-1}
\]
phi=(1+sqrt(5))/2
phi2=(1-sqrt(5))/2
def Binet(n):
return 1/sqrt(5)*(phi^n-phi2^n)
print([Binet(i).expand() for i in [0..10]])
print([fibonacci(i) for i in [0..10]]) # wygląda na to, że formuła Bineta działa!
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
n=var('n') #uwaga - zmienna symboliczna, uproszczenia uzyskane algorytmem stanowią dowód przekształcenia.
(Binet(n)^2-Binet(n+1)*Binet(n-1)).simplify_full().simplify_real()
-(1/2*sqrt(5) + 1/2)^n*(-1/2*sqrt(5) + 1/2)^n
#i ostatni krok uproszczeń
((1/2*sqrt(5) + 1/2)*(-1/2*sqrt(5) + 1/2)).expand()
-1