Pendekatan Rasional terhadap ln (phi)

Internet dan mesin hitung paling presisi saat ini menunjukan bahwa \ln(\phi) adalah bilangan irasional, dugaan saya juga begitu. Alam semesta selalu menunjukan fenomena yang intuitif, namun ketetapan itu sifatnya bebas dari pikiran. Saya percaya bahwa \ln(\phi) tidak hanya inheren dalam e dan \phi, tetapi juga ada di alam dalam bentuk lain. Bila tertarik bagaimana memeriksa keirasionalan suatu bilangan dalam cara yang lebih seksama bisa melalui metode yang sama diterapkan terhadap konstanta Apéry \zeta(3), melalui kriteria keirasionalan yang biasa maupun melalui notasi O besar. Pendekatan rasional melalui continued fraction adalah salah satu metode yang terbaik digunakan. Dari bentuk simple cf \ln(\phi) pada tulisan sebelumnya didapat tiap-tiap bagian bentuk cf linier ini, saya ambil hingga ke-30 (0 di paling awal sebagai bagian integer dari \ln(\phi)) :

simple cf approximation to ln (phi)

Bentuk rasional dari bagian-bagian liner simple cf di atas adalah :

simple cf approximation to ln (phi)

Lompatan besar dalam denominator (misalnya, 20465 → 􀀀6442217) umumnya terjadi pada digit CF “besar”; lompatan kecil (misalnya, 25 →􀀀 27) umumnya terjadi pada digit CF “kecil”. Tidak terdapat pola yang jelas pada digit simple CF \ln(\phi).

simple cf approximation to ln (phi)

Relative error berubah tanda : positif dan negatif secara bergantian, yaitu mendekati \ln(\phi) secara bergantian: overshoot dan undershoot.

Python memiliki keterbatasan untuk mengkonstruk semua bilangan rasional yang paling dekat ke suatu bilangan real tertentu, melalui CF. Meskipun demikian Python mempunyai modul Fractions untuk menghitung bentuk rasional paling dekat terhadap dirinya dengan denominator yang paling dekat. Contoh :


import math
from fractions import Fraction

phi = (1+math.sqrt(5))/2
k = math.log(phi)

print "phi : ", phi
print "k : ", k
print(Fraction.from_float(k).limit_denominator(100))

Output:

phi : 1.61803398875
k : 0.48121182506
38/79

Catatan : Untuk suatu bilangan real x, modul ini mendefiniskan “best upper rational approximation” dalam bentuk pecahan \displaystyle \frac{p}{q} terhadap x sehingga : (1) \displaystyle \frac{p}{q}\geq x, dan (2) jika \displaystyle \frac{p}{q} > \displaystyle \frac{r}{s}\geq x maka s > q, untuk suatu bilangan rasional \displaystyle \frac{r}{s}.

Begitu pula untuk *best lower approximation*. Jadi bisa dibuktikan bahwa bilangan rasional adalah best upper atau best lower approximation terhadap x, jika dan hanya jika ia konvergen atau semikonvergen pada bentuk refresentasi x dalam CF.

Untuk menemukan pendekatan rasional terbaik dengan denominator \leq M, diperlukan best upper dan best lower approximation dengan denominator \leq M dan mengambil mana yang lebih dekat ke x.

Selain fungsi limit_denominator(), modul Fractions ini juga bisa menghitung bilangan rasional dari bentuk desimal berhingga (finite) yang instan, dan mengkonversi langsung secara eksak. Contoh :


import math
from fractions import Fraction

phi = (1+math.sqrt(5))/2
k = math.log(phi)

print "phi : ", phi
print "k : ", k
print(Fraction(k))

Output:

phi : 1.61803398875
k : 0.48121182506
4334370792049413/9007199254740992

Catatan tambahan (update) :

Di Python, terdapat modul Decimal yang bisa digunakan untuk melihat nilai eksak atau untuk mengatur presisi dari suatu nilai float atau desimal tertentu. Artikel menarik dari David Goldberg, What Every Computer Scientist Should Know About Floating-Point Arithmetic. Thanks, Debb.

Advertisements

Distribusi bilangan prima dan fungsi zeta Riemann

Distribusi bilangan prima, atau yang dihitung dengan prime counting function, \pi(x), yaitu jumlah bilangan prima kurang dari atau sama dengan x, kalau diplot hasilnya tampak berupa step function, untuk setiap muncul bilangan prima terjadi kenaikan satu tahap ke atas. Di library mpmath, prime counting function dinyatakan dengan fungsi primepi(). Sebagai contoh untuk membuat plot terhadap distribusi bilangan prima \leq 100 :

from mpmath import *
plot([primepi], [0,100])

hasilnya :

primepi 100

Untuk distribusi bilangan prima \leq 1000 hasil plotnya tampak lebih halus :

primepi 1000

Semakin luas x semakin halus hasil plotnya. Untuk pendekatan lainnya, secara eksak, \pi (x) juga bisa dinyatakan dengan fungsi R (x) dari Riemann, yang dihitung dengan deret Gram,

R(x)=1+\sum_{k=1}^{\infty}\frac{(\ln x)^{k}}{kk!\zeta(k+1)}

Di mana \zeta(k+1) adalah fungsi zeta Riemann.

Fungsi Zeta Riemann pada bidang kompleks

Dari gambar di atas terlihat beberapa nilai zero untuk fungsi zeta Riemann pada bidang kompleks, yang terbagi menjadi trivial zero dan nontrivial zero. Untuk menghitung nontrivial zero di mpmath digunakan fungsi zetazero(). Di IPython saya gunakan kode dari library mpmath untuk menghitung nontrivial zero kesatu sampai dengan kelima sebagai berikut :

In [1]: from mpmath import *
In [2]: mp.dps = 25; mp.pretty = True
In [3]: zetazero(1)
Out[3]: (0.5 + 14.13472514173469379045725j)
In [4]: zetazero(2)
Out[4]: (0.5 + 21.02203963877155499262848j)
In [5]: zetazero(3)
Out[5]: (0.5 + 25.01085758014568876321379j)
In [6]: zetazero(4)
Out[6]: (0.5 + 30.4248761258595132103119j)
In [7]: zetazero(5)
Out[7]: (0.5 + 32.93506158773918969066237j)

Tabel zero fungsi zeta Riemann yang dikompilasi oleh Andrew Odlyzko bisa dilihat di halaman ini.

Ketika Riemann mempelajari distribusi bilangan prima ia memperluas fungsi zeta Euler (yang didefinisikan hanya untuk s pada bagian real saja yang lebih besar dari satu), menjadi :

\zeta(s) = 1 + \frac{1}{2^s} + \frac{1}{3^s} + \frac{1}{4^s} + \frac{1}{5^s} + ... = \sum_{n=1}^{\infty}\frac{1}{n^s}

Untuk semua bidang kompleks dengan kutub s = 1. Trivial zero merupakan bilangan genap negatif, -2, -4, -6, … Nontrivial zero yang saat ini diketahui terletak pada critical strip 0 < \textup{Re}[s] < 1, dan selalu muncul dengan pasangan complex-conjugate. Hipotesis Riemann menyatakan bahwa semua nontrivial zero terletak pada garis kritis \textup{Re}[s] = 1/2. (Catatan : Semua nontrivial zero yang diketahui saat ini terletak pada garis kritis tersebut).

Di library mpmath, distribusi bilangan prima dengan pendekatan fungsi zeta Riemann dinyatakan dengan fungsi riemannr() dan untuk membuat plot terhadap fungsi tersebut :

from mpmath import *
plot([riemannr], [0,100])

Hasil plotnya :

riemannr mpmath 100

Perbedaan antara fungsi prime counting dan pendekatan fungsi Riemann R(x) yaitu kenampakan fluktuasi pada distribusi bilangan prima, yang di fungsi Riemann dapat dinyatakan dalam pengertian seluruh zero fungsi zeta Riemann, yang kemudian dinyatakan dengan notasi \rho via fungsi R itu sendiri :

R(x)-\pi(x)=\sum_{\rho}R(x^{\rho})

Beberapa nilai dari x^{\rho} adalah bilangan kompleks, jadi R di sini merupakan analytic continuation dari nilai real fungsi R. Selanjutnya x^{\rho} bisa dinyatakan menjadi bagian trivial zero dan nontrivial zero, bagian pertama :

R(x^{-2}) + R(x^{-4}) + R(x^{-6}) + ...,

dan bagian kedua dapat ditulis,

\sum_{k=1}^{\infty}[R(x^{\rho_{k}})+R(x^{\rho_{-k}})]

Kontribusi dari masing-masing pasangan complex-conjugate \rho_{k} dan \rho_{-k}=\overline{\rho_{k}} saling menghilangkan bagian imajinernya satu sama lain sehingga :

\pi(x)=R(x)-\sum_{m=1}^{\infty}R(x^{-2m})+\sum_{k=1}^{\infty}T_{k}(x)

dimana :

T_{k}(x)=-R(x^{\rho_{x}})-(R(x^{\rho_{-x}})

adalah nilai real.

Dan akhirnya dapatlah kita definisikan perurutan fungsi R_n(x) yang mendekati \pi(x) pada limit:

R_{n}(x)=R(x)-\sum_{m=1}^{\infty}R(x^{-2m})+\sum_{k=1}^{n}T_{k}(x).

Menggambar Sketsa Bunga Mawar di Python

Bunga mawar (rose) sering dijadikan subjek dalam berbagai karya seni, seperti potret, ilustrasi, lukisan dan juga sebagai subjek atau oranemen dalam arsitektur. Pelukis Perancis, Pierre-Joseph Redouté, terkenal dengan lukisan berbagai jenis bunga mawar yang digambar dengan sangat teliti. Nah, saya di sini tidak akan menggambar bunga mawar sedetail sang pelukis, atau bunga mawar sebagaimana alaminya, tetapi hanya akan menggambar sketsa bunga mawar saja dengan persamaan matematika dibantu dengan bahasa pemrograman Python.

Terinspirasi beberapa bentuk persamaan matematika dari gambar sketsa bunga mawar di halaman web Eric R. Weeks (ditulis dalam gawk script), yang idenya bermula dari “Mathographics” karya Robert Dixon, persamaan dasar untuk bunga mawar dapat ditulis dalam kordinat polar sebagai berikut :

x\left ( r, \theta \right )= r \cos \theta

y\left ( r, \theta \right )= r \sin \theta

dimana :

r=k\left ( a+\sin\left ( b\theta+\frac{k}{c} \right ) \right )

a, b dan c adalah parameter. Berikut ini salah satu satu contoh kode Python yang saya gunakan untuk membuat gambar sketsa dasar bunga mawar :

import matplotlib.pyplot as plt
import numpy as np

a = 15
b = 6
c = 100

theta = np.linspace(-2 * np.pi, 100, num=100)
k = np.linspace(0, 45, num=100)
r = k * (a+np.sin(theta*b+(k/c)))

x = r * np.cos(theta)
y = r * np.sin(theta)

plt.plot(x, y, color='r')
plt.axis('off')
plt.show()

Hasil plotnya :

Red Rose Flower (basic)

Sedikit modifikasi terhadap k pada persamaan r, dengan

k=\left ( \frac{0.8\theta}{2 \pi} \right ) + 3

Beberapa contoh gambar sketsa bunga mawar yang saya hasilkan dengan persamaan terkahir dapat dilihat pada 2 gambar berikut, saya sertakan juga salah satu contoh kode sumbernya di bagian paling bawah.

Red Rose

Sketsa bunga mawar dengan warna pink :

Pink Rose

Sedikit eksplorasi dengan :  k=\left ( \frac{0.8\theta}{2 \pi} \right ) + 1

Pink Rose

Dan ini sketsa gambar yang terakhir, tampak lebih indah dan cantik :

Sketsa Bunga Mawar

Contoh kode sumber untuk membuat plot terhadap persamaan polar gambar ketiga (gambar yang kedua didapatkan dengan membuat variasi pada nilai parameter a, b dan c) :

import matplotlib.pyplot as plt
import numpy as np

a = 8
b = 6
c = 3

theta = np.linspace(0, 45 * 2* np.pi, num=10000)
k = (0.8*theta/(2*np.pi)+3)
r = k *(a+np.sin(theta*b+(k/c)))

x = r * np.cos(theta)
y = r * np.sin(theta)

plt.plot(x, y, color='#CC0066')
plt.axis('off')
plt.show()