Membandingkan dua produk dari daftar bilangan bulat?


10

Misalkan saya memiliki dua daftar bilangan bulat positif dari manitude yang dibatasi, dan saya mengambil produk dari semua elemen dari setiap daftar. Apa cara terbaik untuk menentukan produk mana yang lebih besar?

Tentu saja saya dapat dengan mudah menghitung setiap produk, tetapi saya berharap ada pendekatan yang lebih efisien, karena jumlah digit dalam produk akan meningkat secara linear dengan jumlah syarat, sehingga seluruh perhitungan adalah kuadratik.

Jika saya menambahkan alih-alih mengalikan, saya bisa menggunakan "strategi ritsleting" dengan menambahkan entri secara bertahap dari daftar pertama dan mengurangi dari yang kedua, menghindari kebutuhan untuk menghitung jumlah keseluruhan (besar). Teknik analog untuk produk adalah dengan menjumlahkan logaritma dari entri, tetapi masalahnya sekarang adalah bahwa menghitung log membutuhkan penggunaan aritmatika yang tidak tepat. Kecuali ada beberapa cara untuk membuktikan kesalahan numerik tidak relevan?


Jika kita mengetahui nilai integer maks dan itu tidak bergantung pada n (yaitu, konstanta k) maka kita dapat membuat tabel pencarian faktor-faktor dari semua angka dari 1 hingga k. Sekarang saya pikir jika Anda menulis semuanya dalam basis [produk faktor] menjadi linier karena Anda dapat menghitung produk dalam waktu linier dengan basis itu kemudian membandingkan setiap digit (dimulai dengan digit urutan tertinggi) secara bergantian sampai satu lebih besar dari yang lain. Rinciannya ada sedikit rumit tapi saya pikir itu harus bekerja jika k adalah konstanta.
Phylliida

Saya lebih suka mengatakan bahwa teknik analog untuk produk adalah menjaga bilangan rasional sama dengan elemen pertama dari daftar pertama dibagi dengan elemen pertama dari yang kedua (ditambah penanganan s). Tapi itu tidak terlalu membantu karena jika semua angka adalah koprime, itu akan menghitung kedua produk. | Juga saya tidak yakin bahwa algoritma naif adalah kuadratik. Menghitung produk n bilangan bulat dengan ukuran m dapat memakan waktu hingga C ( m , m ) + C ( m , 2 m ) + . . . + C ( m , ( n0nm mana C ( x , y ) adalah biaya mengalikan x- bit integer dengan y- bit integer. Kecuali Anda menganggap bahwa produk tersebut juga sesuai dengan formatC(m,m)+C(m,2m)+...+C(m,(n-1)m)C(x,y)xy
xavierm02

1
Mungkin ada beberapa cara untuk memperluas metode ini di math.stackexchange.com/a/1081989/10385
xavierm02

Peningkatan pada pendekatan naif: hitung jumlah kemunculan dari masing-masing faktor (dalam waktu linier), dan hanya hitung produk pada akhirnya, menggunakan algoritma powering yang efisien. Ini berfungsi dalam waktu , yaitu O ( nHAI(M.(n)) menggunakan metode tercepat asimptotik saat ini. HAI(ncatatann2HAI(catatann))
Emil Jeřábek

2
Saya akan memikirkan akurasi yang dibutuhkan untuk log. Ini sebenarnya mungkin lebih efisien.
Emil Jeřábek

Jawaban:


6

(Saya mengerti deskripsi masalah sehingga angka-angka input dibatasi oleh konstanta, jadi saya tidak akan melacak ketergantungan pada terikat.)

Masalahnya dipecahkan dalam waktu linier dan ruang logaritmik menggunakan jumlah logaritma. Secara lebih rinci, algoritma ini adalah sebagai berikut:

  1. Menggunakan penghitung biner, hitung jumlah kemunculan dari setiap nomor input yang mungkin ada di kedua daftar.

Ini membutuhkan waktu , dan penghitung menggunakan ruang O ( log n ) , karena setiap penghitung dibatasi oleh nilai n .O(n)O(logn)n

Biarkan menjadi bilangan prima di bawah batas O ( 1 ) . Dengan mendistribusikan setiap penghitung untuk bilangan a ke faktor utama a (dengan kelipatan yang sesuai), dan mengurangkan penghitungan untuk satu daftar dari daftar lainnya, kami memperoleh yang berikut ini dalam waktu O ( log n ) :p1,,pkO(1)aaO(logn)

  1. Bilangan bulat menghitung dengan O ( log n ) bit sehingga masalahnya adalah setara dengan menentukan tanda Λ : = Σ k i = 1 β i log p i .β1,,βkO(logn)Λ:=i=1kβilogpsaya

  2. Jika , jawab bahwa produknya sama.β1==βk=0

Kalau tidak, . Dengan teorema Baker , kita dapat menurunkan batas | | Λ | > 2 - C log n untuk konstanta tertentu C . Dengan demikian, yang berikut ini dengan benar menghitung tanda Λ :Λ0

|Λ|>2-Ccatatann
CΛ
  1. Keluarkan tanda , di mana π i adalah perkiraan log p i to m : = C log n + k + 1 bit akurasi.saya=1kβsayaπsayaπsayacatatanhalsayam: =Ccatatann+k+1

M.(m)mM.(m)=HAI(mcatatanm2HAI(catatanm))HAI(m2)catatanhalsayamHAI(M.(m)catatanm)sayaβsayaπsayaHAI(M.(m))HAI(M.(m)catatanm)HAI(catatannhalHaily(catatancatatann))

HAI(n)


Terima kasih! Saya harus mengerjakan rinciannya nanti, tetapi ini tampaknya sangat menjanjikan!
user168715
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.