Seperti yang sudah dapat Anda pahami dari artikel saya sebelumnya, saya suka menggunakan pengembangan game sebagai alasan untuk menunjukkan matematika yang rumit yang jika tidak demikian, kebanyakan orang tidak akan menggunakannya. Dan artikel ini tidak terkecuali! Saya ingin menunjukkan teknik yang sangat keren, sesuai dengan poin yang menarik bagi saya:
- prosesnya cukup jelas
- itu jauh lebih cepat daripada teknik biasa yang melakukan tugas yang sama
- ia menggunakan properti yang sangat tidak biasa untuk mewakili angka floating-point dalam format floating point, yang menyiratkan bahwa ...
- itu tidak bekerja dalam analisis klasik . Agar algoritma ini berfungsi dalam teori, Anda harus masuk ke dunia indah matematika non-klasik! Dan jika ini tidak membangunkan rasa ingin tahu Anda, maka saya tidak tahu harus berbuat apa lagi.
Artikel ini cukup panjang dan teoretis, karena memerlukan studi mendalam tentang penjelasannya, jadi luangkan waktu Anda dan baca kembali bagian-bagian yang menurut Anda tidak begitu jelas pertama kali.
Sedikit tentang konteks (GPU)
Salah satu aspek penting yang harus Anda perhatikan dalam pengembangan game, dan dalam arti yang lebih luas - di area mana pun dengan penggunaan grafis aktif - adalah bandwidth GPU. Prosesor sentral dan GPU adalah perangkat fisik yang terpisah, dan mereka membutuhkan sinkronisasi untuk bertukar data. Jika Anda sudah melakukan pemrosesan paralel, maka Anda tahu bahwa ketika dua perangkat perlu disinkronkan, ini berarti kehilangan banyak waktu. Interaksi CPU-GPU dalam hal ini tidak berbeda, jadi kami berusaha untuk meminimalkan transfer data, baik dalam jumlah operasi dan jumlah data yang ditransfer.
Meminimalkan jumlah operasi transfer data biasanya dilakukan dengan menggunakan buffering: kami berusaha untuk memasukkan semua data ke dalam jumlah terkecil yang mungkin dari array, dan kemudian kami mentransfer semuanya sekaligus sehingga kita tidak perlu lagi khawatir tentang mereka. Meminimalkan jumlah data dalam operasi transfer adalah topik yang sangat berbeda, dan solusi untuk masalah ini hampir selalu bersifat individual. Sebagai contoh ekstrem dari ini, Anda dapat melihat
bagaimana mesin rendering Destiny mengatur agar sesuai dengan posisi, permukaan normal, bendera material, dan parameter BSDF anisotropik 96-bit penuh, mis. tiga angka floating point (hlm. 62 dan seterusnya). Namun, hasil yang baik dapat dicapai dengan metode umum, yang kemudian ditambahkan solusi individual untuk pengoptimalan.
Hari ini kita akan membahas
kompresi lossless dari masing-masing vektor 3D . Kalimat ini mengandung beberapa kata kunci:
- Vektor 3D tunggal : Vektor 3D memiliki panjang 1
- kompresi lossless : kurangi ukuran deskripsi vektor 3D tunggal tanpa kehilangan keakuratan. Ini adalah kebalikan dari kompresi lossy.
- Terpisah : pengodean dan dekode vektor dilakukan tanpa informasi tentang tetangganya. Jika situasinya berlawanan, maka itu bisa menjadi sesuatu seperti kompresi bets , di mana bukan vektor individu dikompresi, tetapi array mereka
Sebelum melanjutkan, saya harus menyebutkan artikel yang sangat bagus
"Sebuah Survei Representasi Efisien untuk Vektor Unit Independen " oleh Cigolle, Donow, Evangelakos, Mara, McGuire dan Meyer, dari mana saya mendapatkan inspirasi untuk jabatan saya. Saya harus mengatakan
segera bahwa
algoritma yang akan saya bicarakan kurang efisien daripada algoritma Oktober yang disajikan dalam artikel . Jika Anda ingin efisiensi maksimum, maka baca artikel dan gunakan
oktober . Tujuan dari posting saya adalah untuk menunjukkan keindahan menggunakan matematika yang sangat tidak biasa, sambil menciptakan, seperti yang akan kita lihat nanti, algoritma yang sangat nyaman.
Topologi tepat di gim video Anda
Dalam kasus unit sphere, hanya θ dan φ yang penting, karena ρ selalu 1, dan karena itu berlebihan.Titik awal algoritme adalah pengamatan bahwa vektor satuan 3D setara dengan titik pada bola. Seperti yang mungkin Anda ketahui, bola adalah permukaan dua dimensi, yaitu untuk identifikasi unik titik pada bola, hanya diperlukan dua koordinat. Contoh yang sangat umum dari ini adalah koordinat bola, di mana titik pada bola didefinisikan oleh dua sudut, θ dan φ.
Menariknya, properti yang agak tidak menyenangkan adalah bahwa meskipun bola dan kuadrat terisi (satu ruang yang memungkinkan untuk koordinat 2D) adalah objek 2D, sebenarnya tidak ada korespondensi di antara mereka. Ini berarti bahwa tidak ada cara untuk melampirkan titik unik pada bola ke setiap titik unik persegi (setidaknya secara terus menerus); mereka dikatakan
non-homeomorfik (dengan kata lain, yang satu memiliki batas dan yang lain tidak). Hasil yang tidak menyenangkan dari ini adalah bahwa beberapa koordinat 2D hilang dalam arti bahwa koordinat yang berbeda sesuai dengan titik-titik identik pada bola (misalnya, dalam kasus koordinat bola, ketika φ adalah 0, titik yang sesuai akan menjadi kutub utara, terlepas dari koordinat θ). Dalam hal kompresi, kita kehilangan pola bit berharga yang dengannya kita dapat menggambarkan titik-titik bola!
Jika Anda ingin lebih banyak matematika dan Anda ingin membuktikan bahwa kuadrat dan bola itu bukan homeomorfis, maka Anda dapat menggunakan fakta bahwa bola itu, berbeda dengan kuadratnya, tidak dapat dikontrak, dan sifat dapat dikontrakkan adalah sifat topologi; Teorema Borsuk-Ulam juga dapat digunakan sebagai bukti. Mereka juga memberi tahu saya bahwa kelompok homotopy dapat membantu dengan buktinya, tetapi ini sudah di luar bidang keahlian saya.
Namun, masalah ini muncul tidak hanya dengan koordinat bola; setiap representasi 2D terus menerus dari titik-titik bola akan menderita karenanya. Namun, ingat ini untuk masa depan.
Koordinat bola juga memiliki properti buruk lainnya:
- Mereka memiliki distribusi yang buruk di bola. Jika koordinat bola acak dihasilkan dan dikonversi kembali ke titik 3D, mereka membentuk kelompok di sekitar kutub dan akan sangat langka di dekat khatulistiwa. Hal ini disebabkan oleh fakta bahwa vektor 3D di dekat khatulistiwa akan kurang dapat dibedakan secara akurat.
Distribusi pada bola 10.000 koordinat bola terdistribusi seragam - Pengemasan dan pembongkaran mereka mahal. Untuk pengemasan (3D → 2D), diperlukan satu operasi acos dan satu atan2 , yang merupakan fungsi trigonometri terbalik yang cukup mahal, dan untuk membongkar (2D → 3D) diperlukan dua operasi karena dua operasi dan dua dosa operasi, yang juga jauh dari ekonomis, diperlukan.
Lihat artikel di atas untuk mempelajari tentang perbandingan koordinat bola dan metode kompresi lainnya.
Tugas menjaga pola bit ... dan kecepatan
Metode yang akan kami pertimbangkan memiliki keuntungan besar - perhitungannya jauh lebih cepat, lebih dari dua kali lipat tolok ukur naif yang tidak dioptimalkan (diuji pada pengemasan dan membongkar 10 juta vektor acak dalam C ++ di Visual Studio 19 pada Intel Core i5 gen ke-7). Selain itu, metode ini tidak memiliki singularitas, yaitu, setiap titik yang dikemas sesuai dengan satu titik yang tidak dibongkar, berbeda dengan koordinat bola yang disebutkan di atas.
Seperti yang disebutkan sebelumnya, tidak ada homeomorfisme antara unit sphere dan unit square, yaitu, kita tidak dapat mengikat setiap titik unik di dalam persegi dengan titik unik lainnya di bola. Tetapi mari kita pertimbangkan konstruksi berikut - sejauh ini hanya belahan bumi utara, di mana ada titik dengan koordinat Z positif atau nol, yang akan menjadi perhatian kita.
Kami "meratakan" belahan bumi utara ke dalam disk, membuang koordinat Z dari setiap titik (atau memberikan nilai 0).Kami menemukan cara untuk melampirkan setiap titik di belahan bumi utara ke setiap titik dalam satu disk. Beberapa poin penting:
- kutub utara jatuh ke (0, 0).
- setiap titik pada batas hemisfer tetap sama. Lebih khusus lagi, belahan bumi dan cakram memiliki batas yang sama. Ini logis, karena titik-titik pada batas belahan memiliki Z = 0, yaitu, membuang koordinat Z, kami tidak mengubah apa pun.
Kompresi disk: tugas kompleks yang sederhana
Konstruksi berikut ini membutuhkan pengenalan kecil. Untuk berjaga-jaga, saya akan mengatakan bahwa bilangan kompleks adalah perpanjangan dari ruang bilangan real (bilangan biasa seperti 0, 1, 129,43, pi, 335/117, akar kuadrat 2, dan seterusnya), yang menggunakan bilangan khusus yang
saya sebut
imajiner unit . Bilangan kompleks memiliki bentuk
+ ib , di mana
a dan
b adalah bilangan real (masing-masing, bagian nyata dan imajiner), dan
saya memiliki properti i² = -1. Ini memungkinkan kita untuk mencocokkan bilangan kompleks dengan poin pada bidang 2D. Jika kita mengambil untuk
z sejumlah kompleks dari bentuk
z = a + ib , maka kita dapat mewakili
z sebagai titik dengan koordinat (
a ,
b ) pada bidang. Fungsi ekstraksi "bagian nyata" dan "bagian imajiner" dari bilangan kompleks
z dilambangkan dengan
Re (z) dan
Im (z) .
Angka kompleks z dan nilainya.Selain bagian nyata dan imajiner dari bilangan kompleks, panjang dan sudut yang dibentuk olehnya dengan sumbu X juga dapat diperhitungkan.Ini disebut
representasi kutub . Panjang kutub dan sudut kutub adalah norma
| z | dan argumen
Arg (z) . Sifat yang nyaman dari kedua representasi adalah bahwa
penambahan bilangan kompleks dilakukan dengan menambahkan bagian nyata dan imajiner , dan
penggandaan bilangan kompleks dilakukan dengan mengalikan norma dan menambahkan argumen .
Di sini kita tertarik pada dua operasi: mengkuadratkan dan mendapatkan akar kuadrat dari bilangan kompleks. Mengkuadratkan bilangan kompleks sama persis dengan bilangan real: gandakan saja dengan sendirinya, pada dasarnya
mengkuadratkan norma dan menggandakan argumen . Perhatikan bahwa jika norma bilangan kompleks kurang dari 1, maka ketika kuadratkan, panjangnya akan tetap kurang dari satu; Jadi, jika kita mengambil setiap bilangan kompleks pada disk yang memiliki bagian nyata positif, dan meletakkan semuanya dalam kotak, maka pada dasarnya kita akan mendapatkan seluruh disk.
Di sebelah kiri adalah beberapa bilangan kompleks di setengah dari disk dengan bagian nyata positif (koordinat X). Di sebelah kanan adalah hasil mengkuadratkan semua poin ini. Setengah disk sekarang mengisi seluruh disk!Satu trik dikaitkan dengan "menggandakan argumen": itu tergantung pada sisi sumbu X di mana titik terletak. Aturannya ditunjukkan di bawah ini.
Angka kompleks dengan bagian imajiner positif (koordinat Y) berputar ke kiri, dan angka kompleks dengan bagian imajiner negatif (koordinat Y) berputar ke kanan.Seperti dalam kasus bilangan real, akar kuadrat adalah kebalikan dari kuadrat: untuk bilangan kompleks
z yang diberikan, akar kuadrat (dua dari mereka) adalah bilangan
c , sehingga
c² = z . Seperti dalam kasus bilangan real, jika
c adalah akar kuadrat dari
z , maka
-c juga itu. Bahwa dari bilangan
c dan
-c , yang argumennya sama dengan setengah dari argumen
z , disebut akar kuadrat utama (ini mirip dengan mengambil akar kuadrat positif dari bilangan real daripada akar kuadrat negatif).
Jika Anda memahami bahwa ketika bilangan kompleks dikuadratkan, normanya dikuadratkan dan argumennya berlipat ganda, maka Anda dapat dengan mudah menebak bahwa nilai utama dari akar kuadrat mengambil akar kuadrat dari norma dan membagi dua argumen (mengikuti aturan yang ditunjukkan di atas, tetapi dengan panah yang terbalik) . Seperti dalam kasus kuadrat, ketika mengambil akar kuadrat dari bilangan kompleks dengan norma kurang dari 1, norma tetap kurang dari 1; oleh karena itu, ia "mengompres" unit disk menjadi angka real positif setengahnya.
Di sebelah kiri adalah beberapa titik pada satu disk. Sisi kanan menunjukkan hasil dari mengambil akar kuadrat dari semua poin ini. Seluruh disk sekarang pas dengan separuhnya!Ini adalah dasar dari algoritma: pada kenyataannya, kami mengompres seluruh unit disk menjadi setengah - setengah dengan bagian nyata yang positif. Seperti yang Anda ingat, baru-baru ini kami telah meratakan bagian atas bola menjadi disk tunggal; Sekarang layak melihat apa yang akan kita lakukan dengannya.
Menyatukan semuanya
Mari kita simpulkan apa yang baru saja kita lakukan: kita meratakan setengah bola menjadi satu unit disk, membuang koordinat Z dari semua titiknya, dan meremas unit disk menjadi setengahnya sendiri dengan bagian nyata positif menggunakan nilai akar kuadrat utama yang kompleks. Bahkan, kami meratakan setengah bola menjadi setengah disk! Sekarang dengan beberapa perubahan, kita dapat melakukan hal yang sama untuk mengompres separuh bola yang tersisa ke dalam setengah disk yang tersisa.
Setengah bagian bawah bola (semua titik bola dengan koordinat Z negatif) juga diratakan ke dalam unit disk dengan berulang-ulang menjatuhkan koordinat Z. Namun, untuk semua bilangan kompleks
z dalam disk, kami mengambil nilai yang berlawanan dengan akar kuadrat utama dari
z (mis. Kita mengambil
-c alih-alih
c ) Karena nilai utama dari akar kuadrat selalu memiliki bagian nyata yang positif, nilai yang berlawanan akan selalu memiliki bagian nyata yang negatif; pada kenyataannya, kami meratakan sisa setengah bola ke dalam setengah sisa disk, dan tahap kompresi sekarang selesai!
Langkah kompresi penuh. Perhatikan bahwa belahan utara dan selatan (biru dan oranye) diratakan menjadi dua salinan dari satu disk, dan kemudian dikompresi menjadi dua bagian dari satu disk.Algoritma kompresi adalah sebagai berikut:
function packUnitVector(unit) disk = new Complex(unit.x, unit.y) packed = principalSquareRoot(disk) return unit.z < 0 ? -packed : packed
Jadi, hanya dalam tiga baris kodesemu, kami menerapkan keseluruhan teori yang kami periksa untuk membuat algoritma yang efektif. Jika lingkungan Anda tidak memiliki formula untuk nilai utama dari akar kuadrat, maka itu dapat ditemukan
di Wikipedia (perhatian khusus harus diberikan untuk memilih tanda bagian imajiner). Berikut ini adalah implementasi referensi C ++ yang saya gunakan dalam kode saya:
Kembali
Kami mengatasi kompresi, sekarang kami lanjutkan membongkar.
Pembongkaran terdiri dari urutan terbalik semua langkah kompresi:
- kami memperluas bagian positif dan negatif dari bagian material dari disk tunggal menjadi dua disk penuh
- cocokkan setiap disk penuh dengan belahan otak yang sesuai
Singkatnya, kita mulai dengan nilai paket
p , kuadratkan untuk kembali ke titik pada disk yang diperoleh dari salah satu belahan otak, dan kemudian menggunakan tanda
Re (p) untuk mencari tahu di belahan mana titik dari disk tersebut diambil. Dengan menggunakan persamaan
x² + y² + z² = 1 , yang mendefinisikan titik-titik pada unit sphere, kita dapat membuat kembali koordinat Z yang hilang dari titik yang dikemas.
Perlu dicatat bahwa menghitung kuadrat dari nilai yang dikemas akan selalu memberi kita titik disk yang benar, terlepas dari belahan awal (atas atau bawah), karena
z² = (-z) ² .
Algoritma dekompresi adalah sebagai berikut:
function unpackUnitVector(packed): disk = packed * packed unit = new Vec3() unit.x = disk.real() unit.y = disk.imag() unit.z = sqrt(1 - unit.x * unit.x - unit.y * unit.y) * (packed.real() < 0 ? -1 : 1) return unit
Jadi kami mendapatkan algoritma yang sangat efisien membuat representasi 2D vektor 3D tunggal, yang, tidak seperti koordinat bola, tidak kehilangan pola bit apa pun dan tidak memiliki singularitas. Jika Anda tidak memperhitungkan beberapa trik pengoptimalan untuk mempercepat perhitungan, ini adalah versi algoritma yang hampir siap.
... atau tidak? Jika Anda memperhatikan dengan seksama, Anda memperhatikan ada sesuatu yang salah di sini. Saya mengatakan bahwa bola dan satuan persegi bukan homeomorfik, namun entah bagaimana mampu mengikat titik unik di disk ke setiap titik unik di bola? Selain itu, kami belum menyebutkan matematika non-klasik, jadi apa yang terjadi?
Faktanya, algoritma kami memiliki kelemahan serius: ia bekerja untuk setiap titik di seluruh bola, kecuali untuk titik-titik di belahan bumi utara dengan Y = 0 dan X <= 0, yang, ketika mengepak dan membongkar, secara keliru dibandingkan dengan titik yang sesuai di belahan bumi utara.
Alasan untuk ini adalah bahwa ketika koordinat Z mereka dibuang, bilangan kompleks yang sesuai adalah bilangan real negatif, itu tidak memiliki bagian imajiner. Ketika kita mengambil nilai utama dari akar kuadrat dari bilangan real negatif, kita akan mendapatkan bilangan kompleks imajiner sepenuhnya yang tidak memiliki bagian nyata (ini mirip dengan fakta bahwa nilai utama dari akar kuadrat dari -1 sama dengan
i ). Kemudian kami mencoba menjaga tanda koordinat Z pada apa yang pada dasarnya nol.
Strip masalah. Poin dengan Y = 0 dan X <= 0 dikemas ke dalam garis bilangan imajiner murni dengan bagian nyata yang tidak dapat ditentukan.Mari kita lihat apa yang terjadi ketika kita mengemas dua poin tersebut (jangan lupa bahwa x <= 0).
| Titik utara | Titik selatan
unit | (x, 0, z) | (x, 0, -z)
disk | x + 0i | x + 0i
dikemas | 0 + √ (-x) i | -0 - √ (-x) i
Karena bagian imajiner proyeksi ke disk kedua titik sama dengan nol, kita tidak dapat menyimpan tanda koordinat Z dalam tanda bagian nyata dari nilai utama dari akar kuadrat, karena itu sendiri sama dengan nol. Kita dapat dengan mudah memikirkan hal ini, menerima kenyataan bahwa algoritme tidak bekerja untuk titik-titik ini - atau kita dapat melanjutkan.
Lupakan apa yang kita pelajari
Di setiap bidang dan cabang matematika yang saya tahu, diasumsikan 0 = -0. Ini mengikuti dari definisi
-a , yang merupakan kebalikan dari
a , yang menyatakan bahwa
"-a adalah satu-satunya angka yang memberikan 0 ketika dijumlahkan dengan a" . Karena 0 juga merupakan elemen nol sehubungan dengan penjumlahan (
0 + a = a + 0 = a ), satu-satunya hal yang perlu Anda tambahkan ke 0 untuk mendapatkan 0 adalah 0 itu sendiri.
Namun, dalam pengembangan perangkat lunak, semuanya berbeda. Dalam sebagian besar representasi angka floating point, bersama dengan eksponen dan mantissa, bit tambahan digunakan untuk menyimpan karakter. Ini berarti bahwa ketika eksponen dan mantra adalah 0, maka bit tanda dapat digunakan untuk membedakan antara nol positif dan negatif. Dalam kebanyakan bahasa pemrograman (jika tidak semua), kedua nol ini diperlakukan sebagai satu nol tunggal (coba
0 == -0 ), tetapi ada perbedaan, dan ini dapat dilihat jika Anda mencoba untuk output "-0" dan "0 ke terminal "- begitulah cara mereka disimpulkan.
Ini sangat penting bagi kami: nilai nol sebenarnya dapat digunakan untuk menyimpan informasi tentang tanda! Bahkan, bagaimanapun juga itu disimpan dengan benar; dalam kasus kami, masalahnya adalah tidak dibaca dengan benar. Jika kita melihat garis kedua dari belakang dalam algoritma pembongkaran, kita akan melihat yang berikut:
packed.real() < 0 ? -1 : 1
Operasi ini membaca tanda bagian nyata dari nilai yang dikemas untuk menentukan belahan mana titik milik - utara atau selatan. Namun, dalam kasus ketika
packed.real () adalah 0 atau -0, karakter diabaikan oleh operator pembanding dan operator ternary selalu mengembalikan 1. Cara yang benar untuk membaca karakter adalah permintaan
nyata untuk status bit tanda, misalnya, menggunakan
std :: signbit from C ++ atau
np .signbit dari Numpy ke Python - fungsinya tergantung pada bahasa. Ingat bahwa bit tanda 1 ketika angka negatif, dan 0 ketika angka positif.
Dengan demikian, kami mendapatkan fungsi kerja yang dikoreksi dan seratus persen:
function unpackUnitVector(packed): disk = packed * packed unit = new Vec3() unit.x = disk.real() unit.y = disk.imag() unit.z = sqrt(1 - unit.x * unit.x - unit.y * unit.y) * (signbit(packed.real()) ? -1 : 1) return unit
Itu saja! Sekarang algoritma sudah selesai. Matematika non-klasik dimanifestasikan dalam kenyataan bahwa kita menggunakan fakta bahwa 0 berbeda dari -0, yang salah untuk semua bidang matematika yang saya tahu. Namun, ada cara untuk membuat keanehan ini logis dalam pengertian teoretis, matematis yang ketat.
Spasi yang tidak bermain sesuai aturan: garis lurus dengan dua titik asal
Untuk lebih memahami yang berikut ini, Anda harus tahu konsep kelas dan lingkungan ekivalensi. Ini opsional, tetapi akan lebih jelas.
Kita dapat memastikan konsistensi keanehan ini dengan "tanda nol", dimulai dengan ruang topologis yang menarik: garis lurus dengan dua titik asal.
Garis lurus dengan dua titik asal adalah sumbu numerik nyata biasa, yang entah bagaimana menumbuhkan 0 ekstra untuk dirinya sendiri.Garis lurus dengan dua titik asal diperoleh ketika kita mengambil dua sumbu numerik sungguhan dan merekatkan setiap angka dengan kebalikannya, kecuali 0. Secara formal, garis lurus dengan dua titik asal adalah ruang hasil bagi R² dengan relasi ekivalen yang mengidentifikasi dua angka jika keduanya sama
dan bukan 0. Hasilnya adalah garis lurus bilangan real dengan dua nol yang berbeda berjarak sama dari titik mana pun, tetapi pada saat yang sama berbeda satu sama lain. Secara formal, setiap dua lingkungan dari masing-masing nol selalu memiliki persimpangan kosong.
Kami dapat memperluas ini dan mencoba untuk mendefinisikan objek "seperti disk" yang digunakan dalam artikel ini. Sebelumnya, kami secara paksa menyimpan tanda koordinat Z titik di bagian nyata dari akar kuadrat utama dari proyeksi ke disk kompleks, bahkan jika bagian nyata ini adalah 0. Ini berarti bahwa kami tidak menggunakan bilangan kompleks, tetapi konsep lain yang serupa dengan mereka: bilangan kompleks, bagian imajiner yang merupakan bilangan real, dan bagian nyata yang merupakan titik pada garis dengan dua titik asal, sehingga kita dapat membedakan bagian nyata sama dengan +0 dan -0. Bahkan, kami menggunakan
bilangan kompleks dengan dua titik asal!Dan pada kenyataannya, kami tidak menemukan bijection (pemetaan satu-ke-satu) antara bola dan unit disk, tetapi kami menemukan bijungan antara bola dan unit disk dengan dua titik asal. Saya belum menguji apakah penistaan ini adalah homeomorfisme (homeomorfisme adalah penambangan berkelanjutan di kedua arah), tetapi mungkin suatu hari nanti saya akan melakukannya.
Sedikit topologi di bagian akhir
Sebagai kesimpulan, saya ingin menekankan bahwa meskipun bidang kompleks yang kami gunakan dengan dua titik asal tidak mengikuti dari konstruksi yang sama dengan garis lurus dengan dua titik asal, pada kenyataannya, itu setara dengan bidang kompleks lain dengan dua titik asal yang dibangun serupa dengan garis lurus dengan dua asal.
Dalam kasus garis lurus dengan dua titik asal, kami menempelkan dua salinan sumbu numerik nyata di semua tempat kecuali 0. Kita dapat melakukan hal yang sama dengan dua salinan bidang kompleks, menempelkan masing-masing pasangan bilangan kompleks yang sama yang bukan 0, dan juga mendapatkan kompleks sebuah pesawat dengan dua titik asal. Konstruksi ini berbeda dari konstruksi bidang kompleks baru dari garis lurus dengan dua titik asal dan sumbu numerik nyata yang biasa: yang pertama adalah ruang faktor, dan yang terakhir adalah produk dari ruang. Namun, satu-satunya perbedaan antara dua ruang yang dihasilkan adalah cara
menulis nol yang berbeda di setiap ruang: di pertama mereka dihitung sebagai (
0 + 0i) a dan (
0 + 0i) b (dua nol diambil dari dua ruang berbeda yang tidak direkatkan), dan yang terakhir dibaca sebagai
(0a + 0i) dan
(0b + 0i) . Faktanya, kedua ruang adalah homeomorfik, sehingga Anda dapat dengan aman menggunakan satu di mana yang lain diperlukan.
Kesimpulan
Saya harap Anda menikmati perjalanan ini ke dunia matematika yang aneh dan tidak jelas. Saya menekankan kembali fakta bahwa, sebenarnya, algoritma ini berperilaku lebih buruk daripada algoritma
Oktober dari artikel yang saya sebutkan di awal. Meskipun dekat atau bahkan lebih cepat dalam waktu eksekusi, distribusi titik pada bola jauh dari yang baik. Saya menulis artikel ini kemudian untuk menunjukkan bagaimana matematika yang tampaknya asing, mirip dengan omong kosong abstrak, sebenarnya dapat memiliki aplikasi yang sangat menarik di dunia nyata; selain itu, saya menemukan omong kosong abstrak ini menyenangkan. Saya harap Anda mempelajari sesuatu yang bermanfaat dari artikel ini, terima kasih sudah membaca!