Membandingkan bilangan rasional

12

Diberikan dan , b , d { 0 }a,b,c,dNb,d{0}

ab<cdad<cb

Pertanyaan saya adalah:

Diberikana,b,c,d

  1. Dengan asumsi kita dapat memutuskan dalam , apakah ada cara untuk memutuskan tanpa harus terlebih dahulu membentuk multiplikasi (atau divisi), dan . Atau ada semacam bukti bahwa tidak mungkin.O ( | x | + | y | ) a d < c b a d c bx<yZO(|x|+|y|)ad<cbadcb
  2. Apakah ada metode yang lebih cepat untuk membandingkan bilangan rasional daripada mengalikan penyebutnya.
Realz Slaw
sumber
1
@ PKG tetapi penggandaan akan membutuhkan lebih dari waktu linier. Saya pikir kami menginginkan sesuatu yang lebih cepat untuk pertanyaan ini.
Joe
1
Kasing rumit adalah ketika satu interval berisi interval lainnya, misalnya . [a,d][b,c]
PKG
1
Anda secara implisit menganggap bahwa dan memiliki tanda yang sama. Jika tidak, arah ketidaksetaraan akan berubah. dbd
Ran G.
1
(1) Perkalian hampir linier (mencari algoritma Fürer's). (2) "integer rasional", setidaknya dalam konteks teori bilangan aljabar, sebenarnya hanya berarti integer. Anda ingin mengatakan "rasional" atau "angka rasional".
Yuval Filmus
1
lihat juga duplikat jelas Bagaimana membandingkan angka-angka rasional?
vzn

Jawaban:

5

Penelitian saya saat ini:

Upaya awal pada beberapa aturan umum

Seseorang dapat mencoba membuat beberapa aturan umum untuk menyelesaikan perbandingan rasional:

Dengan asumsi semua positif :a,b,c,d

a<bcdab<cd
Ini pada dasarnya berarti, jika sisi kiri kurang dari satu, dan sisi kanan setidaknya satu, sisi kiri kurang dari kanan sisi. Dalam nada yang sama:

abcdabcd

Aturan lain:

(b>d)(ac)[ab<cd]
Saya menganggap aturan ini logis, karena semakin besar penyebutnya, semakin kecil angkanya, sedangkan semakin besar pembilang, semakin besar angkanya. Karenanya jika sisi kiri memiliki penyebut yang lebih besar dan pembilang yang lebih kecil, maka yang kiri akan lebih kecil.

Mulai dari sini, kita akan menganggap bahwa , karena kalau tidak kita dapat menyelesaikannya dengan aturan di atas, atau membalikkan pertanyaan menjadi , dan bagaimanapun kita berakhir dengan kondisi ini.a<cb<dcd<?ab

Aturan : Ini Pada dasarnya aturan menyatakan bahwa Anda selalu dapat mengurangi pembilang dari penyebut, dan mengatur hasilnya sebagai pembilang, untuk mendapatkan masalah yang setara. Saya akan meninggalkan buktinya.

(ba)b<(dc)d[ab<cd]|a<c,b<d

ab<cadb[ab<cd]|a<c,b<d

Aturan ini memungkinkan Anda untuk mengurangi pembilang dan penyebut kiri dari pembilang dan penyebut kanan untuk masalah yang setara.

Dan tentu saja ada scaling:

akbk<cd[ab<cd]|a<c,b<d
You dapat menggunakan penskalaan untuk membuat aturan pengurangan di atas lebih signifikan.

Menggunakan aturan-aturan ini Anda dapat bermain-main dengan hal-hal, menerapkannya berulang kali, dalam kombinasi cerdas, tetapi ada kasus di mana angka-angka dekat, dan patologis.

Dengan menerapkan aturan sebelumnya, Anda dapat mengurangi semua masalah ini ke:

ab<ap+qbp+qab<qq|a>q,b>q

Terkadang Anda bisa menyelesaikannya secara langsung sekarang, kadang tidak. Kasus patologis biasanya dalam bentuk:

ab<cd|a>c,b>d,cO(a),dO(b)

Kemudian Anda membalikkannya, dan menghasilkan hal yang sama, hanya dengan sedikit kurang Setiap aplikasi aturan + flip menguranginya dengan digit / bit. AFAICT, Anda tidak dapat dengan cepat menyelesaikannya, kecuali jika Anda menerapkan aturan kali (satu kali untuk setiap digit / bit) dalam kasus patologis, meniadakan keuntungan yang tampak.O(n)

Masalah terbuka ??

Saya menyadari bahwa masalah ini tampaknya lebih sulit daripada beberapa masalah terbuka saat ini.

Masalah yang bahkan lebih lemah adalah menentukan:

ad=?bc

Namun lebih lemah:

ad=?c

Ini adalah masalah terbuka untuk memverifikasi multiplikasi . Itu lebih lemah, karena jika Anda memiliki cara untuk menentukan , maka kamu dapat dengan mudah menentukan , dengan menguji menggunakan algoritma dua kali, , . Jika salah benar, Anda tahu itu .ad<?bcad=?bcad<?bcbc<?adadbc

Sekarang, adalah masalah terbuka, setidaknya pada tahun 1986:ad=?c

Kompleksitas multiplikasi dan pembagian. Mari kita mulai dengan persamaan kapak yang sangat sederhana = b. Ketika dipertimbangkan atas bilangan bulat, menguji solvabilitasnya dan menemukan solusi x dimungkinkan oleh pembagian bilangan bulat dengan sisa nol. Untuk memeriksa solusi x yang diberikan, perkalian integer sudah cukup, tetapi merupakan masalah terbuka yang menarik apakah ada metode verifikasi yang lebih cepat.

- ARNOLD SCHÖNHAGE dalam Penyelesaian Persamaan dalam Hal Kompleksitas Komputasi

Sangat menarik, ia juga menyebutkan pertanyaan memverifikasi perkalian matriks :

Ini juga merupakan pertanyaan yang menarik apakah verifikasi perkalian matriks, yaitu, memeriksa apakah AB = G untuk C yang diberikan, mungkin dapat dilakukan lebih cepat.

- ARNOLD SCHÖNHAGE dalam Penyelesaian Persamaan dalam Hal Kompleksitas Komputasi

Ini telah dipecahkan, dan memang mungkin untuk memverifikasi dalam waktu dengan algoritma acak (dengan menjadi ukuran matriks input, jadi pada dasarnya waktu linear dalam ukuran input). Saya bertanya-tanya apakah mungkin untuk mengurangi perkalian bilangan bulat ke perkalian matriks, terutama dengan kesamaan mereka, mengingat kesamaan multiplikasi bilangan bulat Karatsuba dengan algoritma perkalian matriks yang diikuti. Maka mungkin dengan beberapa cara kita dapat memanfaatkan algoritma verifikasi perkalian matriks untuk perkalian integer.O(n2)n×n

Lagi pula, karena ini masih, setahu saya, masalah terbuka, masalah yang lebih kuat dari pasti terbuka. Saya ingin tahu apakah menyelesaikan masalah verifikasi kesetaraan akan berpengaruh pada masalah verifikasi ketidaksetaraan perbandingan.ad<?cd

Sedikit variasi dari masalah kita adalah jika fraksi dijamin akan dikurangi ke tingkat terendah; dalam hal ini mudah untuk mengetahui apakah . Apakah ini ada kaitannya dengan verifikasi perbandingan untuk fraksi yang dikurangi?ab=?cd

Pertanyaan yang bahkan lebih halus, bagaimana jika kami memiliki cara untuk menguji , apakah ini akan mencakup pengujian ? Saya tidak mengerti bagaimana Anda dapat menggunakan "dua arah" ini seperti yang kami lakukan untuk .ad<?cad=?cad<?cd

Terkait:

  • Perkiraan Pengakuan Bahasa Non-reguler oleh Finite Automata

    Mereka mengerjakan beberapa perkiraan perkalian, dan verifikasi acak, yang saya tidak sepenuhnya mengerti.

  • math.SE: Bagaimana Membandingkan dua perkalian tanpa mengalikan?
  • Misalkan kita diizinkan untuk preproses sebanyak yang kita inginkan dalam waktu polinomial, dapatkah kita menyelesaikan dalam waktu linier?cab=c
  • Apakah ada algoritma multiplikasi integer nondetermistic linear-time? Lihat http://compgroups.net/comp.theory/nondeterministic-linear-time-multiplication/1129399

    Ada algoritma terkenal untuk mengalikan angka n-bit dengan sesuatu seperti kompleksitas O (n log (n) log (log (n))). Dan kita tidak dapat melakukan lebih baik daripada O (n) karena setidaknya kita harus melihat seluruh input. Pertanyaan saya adalah: dapatkah kita benar-benar mencapai O (n) untuk kelas yang sesuai dari algoritma "nondeterministic"?

    Lebih tepatnya, apakah ada algoritma yang dapat menerima dua angka biner n-bit "a" dan "b" dan angka 2n-bit "c" dan memberi tahu Anda dalam waktu O (n) apakah "a * b = c"? Jika tidak, adakah bentuk lain dari sertifikat C (a, b, c) sehingga algoritma dapat menggunakannya untuk menguji produk dalam waktu linier? Jika bukan waktu linier, apakah masalah pengujian produk setidaknya secara asimptotik lebih mudah daripada menghitungnya? Setiap hasil yang diketahui di sepanjang garis ini akan diterima.

    John

    ―Johnh4717

Realz Slaw
sumber
1

Ini adalah upaya yang sangat parsial untuk menolak. Misalkan kita hanya dapat menggunakan penambahan (jumlah konstan) dan pengurangan pada penentu kita, serta jumlah konstan wrt angka yang telah ditentukan. Dengan kata lain, kita dapat melakukan jumlah konstan dari , , dll dalam penentuan kita. Maka jumlah yang dapat kita hitung adalah dalam bentuk mana adalah konstanta yang telah ditentukan sebelumnya. Perhatikan bahwa dapat dihitung dalam waktu .modmod 2mod 3q=k1a+k2b+k3c+k4d=kiakqO(|a|)

Diedit Penentu ini dimaksudkan untuk menentukan sedikit iff . Pertimbangkan mengambil sebagai poin dalam . Bit ditentukan oleh posisinya di permukaan yang merupakan hiperboloid dalam 4 dimensi. Jika kita memiliki titik di ruang input, penentu di atas dapat menghitung titik dalam jarak terbatas dari titik input ini, yaitu titik-titik dll. Ini mendefinisikan berbentuk kubus dalam ruang 4 d.B:B=1ad>bca,b,c,dR4Bad=bc(a,b,c,d)q:|qa|=k1,

(Bagaimana membuat ini lebih tepat?) Jarak dari kuboid ke permukaan secara umum tidak terbatas, dan karenanya permukaan tidak dapat dihitung oleh penentu.

PKG
sumber
Maaf saya tidak menanggapi ini. Saya pikir ini mungkin hanya di atas pemahaman saya, dan saya sedang sibuk meneliti kemungkinan jawaban untuk sementara waktu.
Realz Slaw
1

Pertanyaan bagus. Apakah Anda akan menerima tingkat kepercayaan?

Mungkin melakukan perkiraan pembagian. Yaitu

Untuk menghitung perkiraan quotients terikat dari a / b, geser ke kanan dengan ceil (log_2 (b)) dan juga dengan floor (log_2 (b)). Maka kita tahu hasil bagi yang akurat adalah antara kedua nilai ini.

Kemudian, tergantung pada ukuran relatif dari empat bilangan bulat, seseorang mungkin dapat mengesampingkan kasus-kasus tertentu, dan mendapatkan kepercayaan 100%.

Seseorang dapat mengulangi prosedur untuk radix selain 2, dan dengan suksesi operasi semacam itu meningkatkan tingkat kepercayaan, sampai suatu perubahan tanda / tie-break teramati?

Itu adalah sketsa konsep metode pertama saya.

Cris Stringfellow
sumber
Jika Anda melihat jawaban "penelitian saat ini" saya, saya pikir aturan itu melakukan sesuatu untuk efek ini. Anda dapat terus berjalan, berkali-kali mendapatkan kepercayaan diri 100% jika itu mengenai salah satu aturan pertama, dan yang terburuk, Anda terus mengulangi aturan yang terakhir berulang-ulang setiap putaran, mirip dengan apa yang Anda sarankan, saya pikir. Namun, pertanyaan saya adalah tentang sesuatu yang pasti dalam (atau lebih tepatnya, lebih baik daripada perkalian, akan memuaskan pertanyaan ini juga), atau setidaknya algoritma acak dengan beberapa probabilitas kecil secara eksponensial kegagalan. O(n)O(nlogn)
Realz Slaw
Juga, jika seseorang dapat memverifikasi bahwa ini adalah masalah terbuka, dan entah bagaimana secara inheren lebih sulit daripada memverifikasi (lihat jawaban "penelitian saat ini", bagian Masalah Terbuka ?? ), atau jika ada beberapa penelitian atau hasil menarik lainnya yang ada tentang ini, maka itu juga bisa menjadi jawaban yang bisa diterima. ab=c
Realz Slaw
1

apakah ada cara untuk memutuskan iklan <cb tanpa harus melipatgandakan multiplikasi [mahal]

Tentu.

Ide: Bandingkan ekspansi desimal sedikit demi sedikit.

Satu-satunya hal yang buruk adalah bahwa kita harus mengecualikan kesetaraan terlebih dahulu karena kalau tidak kita tidak boleh mengakhiri.
Sangat berguna untuk pertama-tama membandingkan bagian integer karena itu mudah.

Pertimbangkan ini:

def less( (a,b), (c,d) ) = {
  // Compare integer parts first
  intA = a div b
  intC = c div d

  if intA < intB
    return True
  else if intA > intB
    return False
  else // intA == intB
    // Normalize to a number in [0,1]
    a = a mod b
    c = c mod d

    // Check for equality by reducing both
    // fractions to lowest terms
    (a,b) = lowestTerms(a,b)
    (c,d) = lowestTerms(c,d)

    if a == c and b == d
      return False
    else
      do
        // Compute next digits in decimal fraction 
        a = 10 * a
        c = 10 * c

        intA = a div b
        intC = c div d

        // Remove integer part again
        a = a mod b
        c = c mod d
      while intA == intC

      return intA < intC
    end
  end
}

Perhatikan bahwa do-whileloop harus diakhiri karena angkanya tidak sama. Kami tidak tahu berapa lama itu berjalan; jika angkanya sangat dekat, bisa jadi sementara.

Jelas, tidak ada perkalian yang mahal; satu-satunya yang kita butuhkan adalah mengalikan nominator dengan . Secara khusus, kami menghindari penghitungan dan secara eksplisit.10adcb

Apakah ini cepat? Mungkin tidak. Ada banyak divisi integer, modulos, dan gdcs untuk dihitung, dan kami memiliki loop yang jumlah iterasinya berbanding terbalik dengan jarak antara angka yang kami bandingkan.


Metode pembantu:

def lowestTerms(a,b) = {
  d = gcd(a,b)
  if d == 1
    return (a,b)
  else
    return lowestTerms(a div d, b div d)
  end
}
Raphael
sumber
Saya pikir ini bukan semangat pertanyaan. Menghitung dan sejak awal sudah menghabiskan banyak waktu seperti menghitung dan dalam pertanyaan, dan pertanyaan itu sudah mengatakan "tanpa ... perkalian (atau pembagian), dan ". Itu juga meminta algoritma waktu linier, yang saya kira ini bukan, berdasarkan komentar Anda tentang loop berjalan untuk sementara waktu. a/bc/dadbcadcb
David Richerby
@ DavidRicherby Hm. Saya berpikir tentang meluap terutama - di sini, operasi cenderung membuat jumlah besar.
Raphael