import platform
platform.platform()
platform.python_version()
import sympy as sp
sp.__version__
sp.init_printing()
Funkcija za kontrolirani ispis po retcima
def ispis(objekt,br):
objekt=str(objekt)
d=len(objekt)
red=d // br
ostatak=d % br
za_ispis=""
for k in range(red):
za_ispis=za_ispis+objekt[k*br:(k+1)*br]+"\n"
if ostatak == 0:
za_ispis = za_ispis[:-1]
else:
za_ispis = za_ispis+objekt[red*br:]
print(za_ispis)
$5!=120$
sp.factorial(5)
$0!=1$
sp.factorial(0)
$100!$ jednako je ?? :-)
sp.factorial(100)
sp.pprint(sp.factorial(100))
$\binom{6}{4}=15$
sp.binomial(6,4)
$\binom{100}{98}=4950$
sp.binomial(100,98)
$\binom{n}{0}=1$
n = sp.symbols('n', integer=True)
sp.binomial(n,0)
$\binom{n}{1}=n$
sp.binomial(n,1)
$\binom{n}{n}=1$
sp.binomial(n,n).expand(func=True)
sp.binomial(n,3).expand(func=True)
Svi binomni koeficijenti oblika $\binom{5}{k}$ za $k\in\{0,1,2,3,4,5\}$
sp.binomial_coefficients(5)
sp.binomial_coefficients_list(5)
sp.var('x y');
$(x+y)^5=x^5+5x^4y+10x^3y^2+10x^2y^3+5xy^4+y^5$
sp.expand((x+y)**5)
$(x+y)^{50}=\cdots\ $ :-)
ispis(sp.expand((x+y)**50),80)
sp.expand((x**sp.Rational(1,3)+x**2)**4)
sp.expand((x**sp.Rational(1,3)-x**2)**4)
f=sp.expand((x**sp.Rational(2,3)+x**sp.Rational(3,4))**11)
koeficijent uz $x^8$
f.coeff(x**8)
SymPy ima svoj raspored članova
f.args
Stoga je najbolje da definiramo svoju funkciju
def KTIclan(a,b,n,k):
return sp.binomial(n,k-1)*a**(n-k+1)*b**(k-1)
peti član
KTIclan(x**sp.Rational(2,3),x**sp.Rational(3,4),11,5)
Ne postoji član koji ne sadrži $x$, tj. svi članovi sadrže neku potenciju od $x^r$ za $r\neq 0$.
[t.has(x) for t in f.args]
sp.expand((y**sp.Rational(-3,4)-y**sp.Rational(1,2))**4)
Napomena. Na Matematici 1 se binomni koeficijent $\binom{n}{k}$ definira samo za $n\in\mathbb{N}$, $k\in\mathbb{N}\cup\{0\}$ i uz pretpostavku da je $k\leqslant n$. Stoga bi u našem slučaju gornja rješenja $n=0$ i $n=1$ otpala i jednadžba ima samo jedno rješenje $n=8$. Međutim, općenito se binomni koeficijent $\binom{\alpha}{k}$ može definirati za $\alpha\in\mathbb{R}$ i $k\in\mathbb{N}\cup\{0\}$. Naravno, SymPy zna tu definiciju i zato daje tri korektna rješenja.
$\binom{0}{4}=0$
sp.binomial(0,4)
$\binom{1}{4}=0$
sp.binomial(1,4)
$\displaystyle\binom{-\frac{1}{2}}{5}=-\frac{63}{256}$
sp.binomial(sp.Rational(-1,2),5)
Općenita definicija binomnog koeficijenta glasi
$$\binom{\alpha}{0}=1,\quad \binom{\alpha}{k}=\frac{\alpha\cdot(\alpha-1)\cdot(\alpha-2)\cdots(\alpha-k+2)\cdot(\alpha-k+1)}{k!},\quad \alpha\in\mathbb{R},\ k\in\mathbb{N}$$sp.var('k n');
$1+2+3+\cdots+n=\frac{n(n+1)}{2}$
sp.summation(k,(k,1,n))
sp.summation(k,(k,1,n)).factor()
$1^2+2^2+3^2+\cdots+n^2=\frac{1}{6}n(n+1)(2n+1)$
sp.summation(k**2,(k,1,n))
sp.summation(k**2,(k,1,n)).factor()
$1^3+2^3+3^3+\cdots+n^3=\frac{n^2(n+1)^2}{4}$
sp.summation(k**3,(k,1,n))
sp.summation(k**3,(k,1,n)).factor()
$1+3+5+\cdots+(2n-1)=n^2$
sp.summation(2*k-1,(k,1,n))
$4+20+48+\cdots+2n(3n-1)=2n^2(n+1)$
sp.summation(2*k*(3*k-1),(k,1,n))
sp.summation(2*k*(3*k-1),(k,1,n)).factor()
$\displaystyle\sum_{k=0}^n{\big(6k^2-4k^3\big)}=n(n+1)(1+n-n^2)$
sp.summation(6*k**2-4*k**3,(k,1,n))
sp.summation(6*k**2-4*k**3,(k,1,n)).factor()
Iako na računalu ne možemo provesti matematičku indukciju, možemo provesti nepotpunu indukciju, tj. tvrdnju provjeriti za puno prirodnih brojeva. Naravno, to nije dokaz, nego samo eksperiment, a matematika eksperiment ne priznaje kao dokaz.
$19\mid 7\cdot 5^{2n}+12\cdot 6^n$
Napravimo listu brojeva oblika $7\cdot 5^{2n}+12\cdot 6^n$ za $n\in\{1,2,3,\ldots,99,100\}$. Vidimo da ti brojevi brzo rastu, a to je zbog toga što eksponencijalna funkcija brzo raste.
ispis([7*5**(2*n)+12*6**n for n in range(1,101)],120)
Pogledajmo ostake koje daju prvih $100$ brojeva oblika $7\cdot 5^{2n}+12\cdot 6^n$ pri dijeljenju s $19$.
ispis([(7*5**(2*n)+12*6**n)%19 for n in range(1,101)],80)
Možemo tvrdnju provjeriti i za prvih $1000$ brojeva oblika $7\cdot 5^{2n}+12\cdot 6^n$
ispis([(7*5**(2*n)+12*6**n)%19 for n in range(1,1001)],80)
Dakle, za prvih $1000$ prirodnih brojeva vrijedi tvrdnja $19\mid 7\cdot 5^{2n}+12\cdot 6^n$. Međutim, to još uvijek nije dokaz da tvrdnja vrijedi za svaki prirodni broj $n$, iako je ona provjerena za "puno" prirodnih brojeva.
U današnje vrijeme, kada imamo tako jaka računala i tako prekrasne besplatne alate kao što je Python i SymPy, Eulerovu tvrdnju je lako opovrgnuti, tj. dokazati da ona nije istinita.
Prvih $39$ takvih brojeva
ispis([n**2+n+41 for n in range(1,40)],80)
jesu zaista prosti
ispis([sp.isprime(n**2+n+41) for n in range(1,40)],80)
No, za $n=40$ i $n=41$ brojevi oblika $n^2+n+41$ su složeni
[sp.isprime(n**2+n+41) for n in [40,41]]
No, ima još dosta $n$-ova za koje su brojevi oblika $n^2+n+41$ složeni. Pogledajmo koliko među prvih $1000$ brojeva tog oblika ima složenih.
lista1000=[sp.isprime(n**2+n+41) for n in range(1,1001)]
ispis(lista1000,80)
Vidimo da na dosta mjesta piše False, što znači da je broj složen, tj. da nije prost. No, da mi ručno ne brojimo koliko ih stvarno ima, neka Python to prebroji.
lista1000.count(False)
Dakle, među prvih $1000$ brojeva oblika $n^2+n+41$, čak njih $419$ su složeni, tj. nisu prosti. Ugrubo rečeno, među prvih $1000$ takvih brojeva, oko $40\%$ njih su složeni brojevi, a to je dosta daleko od Eulerove hipoteze da su svi oni prosti. Eh, da je Euler imao današnja računala i Python, ne bi napravio takvu pogrešku. No, lako je sada biti pametan. :-)