So sánh số hữu tỉ


12

Cho a,b,c,dNb,d{0} ,

ab<cdad<cb

Câu hỏi của tôi là:

Cho a,b,c,d

  1. Giả sử chúng ta có thể quyết định x<yZ trong O(|x|+|y|) , là có cách nào để quyết định ad<cb mà không cần phải phôi các phép nhân (hoặc bộ phận), adcb . Hoặc có một số loại bằng chứng rằng không có cách nào.
  2. Có một phương pháp nhanh hơn để so sánh các số hữu tỷ hơn là nhân ra các mẫu số.

1
@PKG nhưng phép nhân sẽ mất nhiều thời gian hơn tuyến tính. Tôi nghĩ rằng chúng tôi muốn một cái gì đó nhanh hơn cho câu hỏi này.
Joe

1
Trường hợp khó khăn là khi một khoảng chứa một khoảng khác, ví dụ [a,d][b,c] .
PKG

1
Bạn mặc nhiên cho rằng d có cùng dấu. Mặt khác, hướng bất bình đẳng thay đổi. bd
Ran G.

1
(1) Phép nhân gần như tuyến tính (tìm kiếm thuật toán của Fürer). (2) Một "số nguyên hợp lý", ít nhất là trong bối cảnh của lý thuyết số đại số, thực ra chỉ có nghĩa là một số nguyên. Bạn muốn nói "số hữu tỷ" hoặc "số hữu tỷ".
Yuval Filmus

1
xem thêm trùng lặp rõ ràng Làm thế nào để so sánh số hữu tỷ?
vzn

Câu trả lời:


5

Nghiên cứu hiện tại của tôi:

Nỗ lực ban đầu ở một số quy tắc chung

Người ta có thể cố gắng đưa ra một số quy tắc chung để giải quyết so sánh hợp lý:

Giả sử tất cả dương :a,b,c,d

a<bcdab<cd
Điều này về cơ bản có nghĩa là, nếu bên trái ít hơn một, và bên phải ít nhất là một, bên trái ít hơn bên phải. Trong cùng một tĩnh mạch:

abcdabcd

Một quy tắc khác:

Tôi nghĩ quy tắc này là hợp lý, vì mẫu số càng lớn, số càng nhỏ, trong khi tử số càng lớn, số càng lớn. Do đó, nếu bên trái có mẫu số lớn hơntử số nhỏ hơn, bên trái sẽ nhỏ hơn.

(b>d)(ac)[ab<cd]

Từ đây trở đi, chúng ta sẽ giả sử rằng , bởi vì nếu không, chúng ta có thể giải quyết nó bằng các quy tắc ở trên hoặc đảo ngược câu hỏi thành ca<cb<d , và dù sao chúng ta cũng kết thúc với tình trạng này.cd<?ab

Quy tắc :

(ba)b<(dc)d[ab<cd]|a<c,b<d
Về cơ bản, quy tắc này nói rằng bạn luôn có thể trừ các tử số khỏi mẫu số và đặt kết quả làm tử số để có được một vấn đề tương đương. Tôi sẽ để lại bằng chứng.

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

Quy tắc này cho phép bạn trừ đi tử số và mẫu số bên trái từ tử số và mẫu số bên phải cho một vấn đề tương đương.

Và tất nhiên là có tỉ lệ:

akbk<cd[ab<cd]|a<c,b<d
Bạn có thể sử dụng tỷ lệ để làm cho các quy tắc trừ ở trên có ý nghĩa hơn.

Sử dụng các quy tắc này, bạn có thể chơi xung quanh với mọi thứ, áp dụng chúng nhiều lần, trong các kết hợp thông minh, nhưng có những trường hợp số gần nhau và bệnh lý.

Bằng cách áp dụng các quy tắc trước đó, bạn có thể giảm tất cả các vấn đề này thành: a

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

Đôi khi bạn có thể giải quyết điều này trực tiếp bây giờ, đôi khi không. Các trường hợp bệnh lý thường ở dạng:

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

Sau đó, bạn lật nó, và kết quả là điều tương tự, chỉ với một chút ít hơn. Mỗi ứng dụng của quy tắc + lật làm giảm nó bằng một chữ số / bit. AFAICT, bạn không thể nhanh chóng giải quyết nó, trừ khi bạn áp dụng quy tắc lần (một lần cho mỗi chữ số / bit) trong trường hợp bệnh lý, phủ nhận lợi thế dường như của chúng.O(n)

Vấn đề mở ??

Tôi nhận ra rằng vấn đề này dường như khó hơn một số vấn đề mở hiện tại.

Một vấn đề thậm chí còn yếu hơn là xác định:

ad=?bc

Và còn yếu hơn:

ad=?c

Đây là vấn đề mở của xác minh nhân . Đó là yếu hơn, bởi vì nếu bạn đã có một cách để xác định , sau đó bạn có thể dễ dàng xác định một d ? = b c , bằng cách kiểm tra bằng thuật toán hai lần, a d ? < b c , b c ? < a d . Iff hoặc là đúng, bạn biết rằng một dad<?bcad=?bcad<?bcbc<?ad .adbc

Bây giờ, là một vấn đề mở, ít nhất là vào năm 1986:ad=?c

Sự phức tạp của phép nhân và chia. Hãy bắt đầu với phương trình rất đơn giản ax = b. Khi xem xét qua các số nguyên, kiểm tra khả năng thanh toán của nó và tìm một giải pháp x có thể bằng cách chia số nguyên với số dư còn lại. Để kiểm tra một giải pháp x đã cho, phép nhân số nguyên sẽ đủ, nhưng đây là một vấn đề mở thú vị cho dù có phương pháp xác minh nhanh hơn.

- KIẾN TRÚC KIẾN TRÚC trong phương trình giải các thuật ngữ về độ phức tạp tính toán

Rất thú vị, anh ấy cũng đề cập đến câu hỏi về xác minh nhân ma trận :

Đây cũng là một câu hỏi thú vị về việc xác minh nhân ma trận, tức là kiểm tra xem AB = G cho C đã cho, có thể được thực hiện nhanh hơn không.

- KIẾN TRÚC KIẾN TRÚC trong phương trình giải các thuật ngữ về độ phức tạp tính toán

Điều này đã được giải quyết và thực sự có thể xác minh trong thời gian bằng thuật toán ngẫu nhiên (với n × nO(n2)n×n là kích thước của ma trận đầu vào, vì vậy về cơ bản là thời gian tuyến tính theo kích thước của đầu vào ). Tôi tự hỏi liệu có thể giảm phép nhân số nguyên thành phép nhân ma trận, đặc biệt là với các điểm tương đồng của chúng, với các điểm tương tự của phép nhân số nguyên Karatsuba với các thuật toán nhân ma trận theo sau. Sau đó, có lẽ bằng một cách nào đó chúng ta có thể tận dụng thuật toán xác minh nhân ma trận để nhân số nguyên.

Dù sao, vì điều này vẫn còn, theo hiểu biết của tôi, một vấn đề mở, vấn đề mạnh hơn của ad<?cd chắc chắn là mở. Tôi tò mò nếu giải quyết vấn đề xác minh bình đẳng sẽ có bất kỳ ảnh hưởng nào đến vấn đề xác minh bất bình đẳng so sánh.

Một sự thay đổi nhỏ của vấn đề của chúng tôi sẽ là nếu các phân số được đảm bảo giảm xuống các điều khoản thấp nhất; trong trường hợp này thật dễ dàng để biết nếu ab=?cd . Điều này có thể có bất kỳ liên quan đến xác minh so sánh cho các phân số giảm?

Một câu hỏi thậm chí tinh vi hơn, nếu chúng ta có cách để kiểm tra , điều này sẽ mở rộng để thử nghiệm một d ? = c ? Tôi không thấy làm thế nào bạn có thể sử dụng "cả hai cách" như chúng tôi đã làm cho một d ? < c d .ad<?cad=?cad<?cd

Liên quan:

  • Công nhận gần đúng các ngôn ngữ không thường xuyên của Finite Automata

    Họ thực hiện một số công việc về phép nhân gần đúng và xác minh ngẫu nhiên mà tôi không hiểu đầy đủ.

  • math.SE: Làm thế nào để so sánh hai phép nhân mà không cần nhân?
  • Giả sử chúng tôi được phép preprocess nhiều như chúng tôi muốn trong thời gian đa thức, chúng ta có thể giải quyết một b = ccab=c trong thời gian tuyến tính?
  • Có một thuật toán nhân số nguyên không thời gian tuyến tính? Xem http://compgroups.net/comp.theory/nondeterministic-linear-time-multiplication/1129399

    Có các thuật toán nổi tiếng để nhân các số n bit với độ phức tạp như O (n log (n) log (log (n))). Và chúng ta không thể làm tốt hơn O (n) vì ít nhất chúng ta phải xem xét toàn bộ đầu vào. Câu hỏi của tôi là: chúng ta thực sự có thể đạt O (n) cho một lớp thuật toán "không xác định" phù hợp không?

    Chính xác hơn, có một thuật toán có thể chấp nhận hai số nhị phân n bit "a" và "b" và số 2n bit "c" và cho bạn biết trong thời gian O (n) liệu "a * b = c" không? Nếu không, có một số dạng chứng chỉ C (a, b, c) khác sao cho thuật toán có thể sử dụng nó để kiểm tra sản phẩm trong thời gian tuyến tính không? Nếu không phải là thời gian tuyến tính, thì vấn đề kiểm tra sản phẩm ít nhất là dễ dàng hơn so với việc tính toán nó? Bất kỳ kết quả được biết dọc theo những dòng này sẽ được hoan nghênh.

    John.

    ―Johnh4717


1

modmod 2mod 3q=k1a+k2b+k3c+k4d=kiakqO(|a|)

B:B=1ad>bca,b,c,dR4Bad=bc(a,b,c,d)q:|qa|=k1,

(Làm thế nào để làm cho điều này chính xác hơn?) Khoảng cách từ hình khối đến bề mặt nói chung là không giới hạn, và do đó bề mặt không thể được tính toán bởi người quyết định


Xin lỗi tôi đã không đáp ứng với điều này. Tôi nghĩ rằng điều này có thể đơn giản là trên mức hiểu biết của tôi và tôi đã bận rộn tự nghiên cứu các câu trả lời có thể.
Realz Slaw

1

Câu hỏi hay. Bạn có chấp nhận mức độ tự tin?

Có lẽ làm phân chia gần đúng. I E

Để tính các chỉ số gần đúng giới hạn của a / b, phải dịch chuyển a theo trần (log_2 (b)) và theo tầng (log_2 (b)). Sau đó, chúng ta biết thương số chính xác là giữa hai giá trị này.

Sau đó, tùy thuộc vào kích thước tương đối của bốn số nguyên, người ta có thể loại trừ một số trường hợp nhất định và có được độ tin cậy 100%.

Người ta có thể lặp lại quy trình cho cơ số khác 2, và bằng cách nối tiếp các hoạt động như vậy làm tăng mức độ tin cậy, cho đến khi thay đổi dấu hiệu / tie-break được quan sát bằng cách nào đó?

Đó là bản phác thảo đầu tiên của tôi về một phương pháp.


Nếu bạn nhìn vào câu trả lời "nghiên cứu hiện tại" của tôi, tôi nghĩ những quy tắc đó sẽ làm gì đó cho hiệu ứng này. Bạn có thể tiếp tục, nhiều lần nhận được sự tự tin 100% nếu nó đạt một trong những quy tắc đầu tiên và trong trường hợp xấu nhất, bạn cứ lặp đi lặp lại các quy tắc sau lặp đi lặp lại mỗi lần xóa một chút, tương tự như những gì bạn đang đề xuất, tôi nghĩ vậy. Tuy nhiên, câu hỏi của tôi là về một cái gì đó dứt khoát trongÔi(n) (hay đúng hơn, tốt hơn so với nhân, Ôi(nđăng nhậpn)cũng sẽ thỏa mãn câu hỏi này), hoặc ít nhất là một thuật toán ngẫu nhiên với một số xác suất thất bại nhỏ theo cấp số nhân.
Realz Slaw

Ngoài ra, nếu người ta có thể xác minh rằng đây là một vấn đề mở và không khó hơn là xác minh mộtb= =c(xem câu trả lời "nghiên cứu hiện tại" của tôi, phần Vấn đề mở ?? ) hoặc nếu có một số nghiên cứu hoặc kết quả thú vị khác về vấn đề này, thì đó cũng có thể là một câu trả lời chấp nhận được.
Realz Slaw

1

Có cách nào để quyết định quảng cáo <cb mà không phải tạo ra các phép nhân [đắt]

Chắc chắn rồi.

Ý tưởng: So sánh bit mở rộng thập phân theo bit.

Điều khó chịu duy nhất là chúng ta phải loại trừ sự bình đẳng trước vì nếu không chúng ta có thể không chấm dứt.
Trước tiên, rất hữu ích khi so sánh các phần nguyên bởi vì điều đó là dễ dàng.

Xem xét điều này:

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
}

Lưu ý rằng do-whilevòng lặp phải chấm dứt do các số không bằng nhau. Chúng tôi không biết nó chạy trong bao lâu; nếu các số rất gần nhau, nó có thể là một thời gian.

Rõ ràng, không có phép nhân đắt tiền; điều duy nhất chúng ta cần là nhân các ứng cử viên với10. Đặc biệt, chúng tôi đã tránh máy tính mộtdcb rõ ràng

Có nhanh không Chắc là không. Có rất nhiều phép chia số nguyên, modul và gdcs để tính toán và chúng ta có một vòng lặp có số lần lặp tỷ lệ nghịch với khoảng cách giữa các số chúng ta so sánh.


Phương thức trợ giúp:

def lowestTerms(a,b) = {
  d = gcd(a,b)
  if d == 1
    return (a,b)
  else
    return lowestTerms(a div d, b div d)
  end
}

Tôi không nghĩ rằng đây là tinh thần của câu hỏi. Tin họcmột/bc/d ngay khi bắt đầu đã mất nhiều thời gian như tính toán mộtdbc trong câu hỏi và câu hỏi đã nói "không có ... phép nhân (hoặc phép chia), mộtdcb". Nó cũng yêu cầu một thuật toán thời gian tuyến tính, mà tôi đoán là không, dựa trên nhận xét của bạn về vòng lặp chạy trong một thời gian.
David Richerby 22/03/2016

@DavidR Richby Hừm. Tôi đã suy nghĩ về việc tràn chủ yếu - ở đây, các hoạt động ít có khả năng tạo ra số lượng lớn.
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.