Saya berada di rumah seorang teman untuk makan malam dan mereka menyarankan ide "ruang vektor faktor Utama". Dalam ruang ini bilangan bulat positif dinyatakan sebagai vektor sehingga elemen ke- n dalam vektor adalah berapa kali bilangan ke- n membagi angka tersebut. (Perhatikan bahwa ini berarti vektor kita memiliki jumlah syarat yang tak terbatas.) Misalnya 20 adalah
2 0 1 0 0 0 ...
Karena faktorisasi utamanya adalah 2 * 2 * 5 .
Karena faktorisasi prima adalah unik, setiap angka berhubungan dengan satu vektor.
Kami dapat menambahkan vektor dengan menambahkan entri secara berpasangan. Ini sama dengan mengalikan angka yang dikaitkan dengan mereka. Kita juga bisa melakukan perkalian skalar, yang mirip dengan menaikkan angka terkait ke suatu kekuatan.
Masalahnya adalah bahwa ruang ini sebenarnya bukan ruang vektor karena tidak ada invers. Jika kita teruskan dan menambahkan invers dan menutup ruang vektor, kita sekarang memiliki cara untuk mengekspresikan setiap bilangan rasional positif sebagai vektor. Jika kita menjaga fakta bahwa penambahan vektor mewakili perkalian. Maka kebalikan dari bilangan alami adalah kebalikannya.
Misalnya angka 20 memiliki vektor
2 0 1 0 0 0 ...
Jadi pecahan 1/20 adalah kebalikannya
-2 0 -1 0 0 0 ...
Jika kita ingin menemukan vektor yang terkait dengan fraksi seperti 14/15 kita akan menemukan 14
1 0 0 1 0 0 ...
dan 1/15
0 -1 -1 0 0 0 ...
dan gandakan dengan melakukan penambahan vektor
1 -1 -1 1 0 0 ...
Sekarang kita memiliki ruang vektor, kita dapat memodifikasinya untuk membentuk ruang produk dalam dengan memberikannya produk dalam. Untuk melakukan ini, kami mencuri produk dalam bahwa ruang vektor diberikan secara klasik. Produk dalam dari dua vektor didefinisikan sebagai jumlah dari perkalian berpasangan dari istilah mereka. Misalnya 20 · 14/15 akan dihitung sebagai berikut
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
Sebagai contoh lain produk 2/19 · 4/19
2/19 = 1 0 0 0 0 0 0 -1 0 0 0 ...
4/19 = 2 0 0 0 0 0 0 -1 0 0 0 ...
2 0 0 0 0 0 0 1 0 0 0 ... -> 3
Tugas Anda adalah mengimplementasikan program yang menjalankan produk titik ini. Ini harus mengambil dua bilangan rasional positif melalui sepasang bilangan bulat positif (pembilang dan penyebut) atau tipe rasional (pelampung tidak diperbolehkan, karena mereka menyebabkan masalah dengan presisi dan keterbagian) dan harus menghasilkan bilangan bulat yang mewakili produk titik dari keduanya. input.
Ini adalah kode-golf sehingga jawaban akan dicetak dalam byte dengan lebih sedikit byte yang lebih baik.
Uji Kasus
4 · 4 = 4
8 · 8 = 9
10 · 10 = 2
12 · 12 = 5
4 · 1/4 = -4
20 · 14/15 = 1
2/19 · 4/19 = 3
sumber
Jawaban:
MATL , 12 byte
Input adalah sebuah array
[num1 den1 num2 den2]
.Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Pertimbangkan contoh input
[20 1 14 15]
.sumber
C (gcc) , 99 + 32 = 131 byte
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
,.Cobalah online!
sumber
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
(32 byte) digunakan (jadi 99 + 32 = 131); jika tidak, kode itu sendiri tidak masuk akal.Jelly ,
1211 byteCobalah online!
sumber
Python 2 , 110 byte
Cobalah online!
Mengambil input seperti
[num1, num2, den1, den2]
. Menggunakan bilangan kompleksr
untuk menyimpan entri untuk primap
untuk dua rasional, dan(r*r).imag/2
untuk mengekstraksi produk merekar.real*r.imag
dalam jumlah keseluruhant
. Menambahkan1j**i
untuki=0,1,2,3
apakah setiap kombinasi menambah atau mengurangi bagian nyata atau imajiner untuk empat angka input.Bubbler menyimpan 2 byte dengan menggabungkan nilai awal
p=t=2
.sumber
p=t=2
alih-alihp=2;t=0
sejakt.real
itu diabaikan saja ( TIO ).Bahasa Wolfram (Mathematica) , 55 byte
Cobalah online!
sumber
JavaScript (Node.js) ,
104...10094 byteCobalah online!
Pass angka-angka sebagai array [Num1, Den1, Num2, Den2].
Terima kasih untuk Arnauld karena memperbaiki yang hilang
F=
tanpa byte tambahan, dan 2 byte lebih sedikit.Penjelasan & ungolfed
sumber
J , 19 byte
Cobalah online!
Penjelasan:
Sebuah kata kerja diad, argumen ada di sisi kiri dan kanan
sumber
Stax , 11 byte
Jalankan dan debug itu
Representasi ascii yang sesuai dari program yang sama adalah ini.
Pada dasarnya, ia mendapat eksponen faktorisasi utama untuk setiap bagian. Dibutuhkan perbedaan dari masing-masing pasangan, kemudian produk, dan akhirnya merangkum semua hasil.
sumber
Python 2 ,
133127 byteCobalah online!
Mencuri kondisi loop dari pengajuan xnor .
Terima kasih atas saran dari @mathmandan untuk mengubah fungsi menjadi program (Ya, itu memang menghemat beberapa byte).
Usang, solusi salah (124 byte):
sumber
p
akan menguji nilai non-prime seperti 9?return
denganprint
, dan Anda juga dapat menyimpan ruang lekukan jika Anda menulis sebagai program alih-alih fungsi.eval()
kecuali fungsi input itu sendiri adalah sebuah string).Haskell , 153 byte
Cobalah online! Contoh penggunaan untuk
20 · 14/15
:(2%) [20,1,14,15]
.sumber