유리수 비교


12

주어진 과 ,a,b,c,dNb,d{0}

ab<cdad<cb

내 질문은 :

주어진 a,b,c,d

  1. 우리가 결정할 수 있습니다 가정하면 x<yZ 에서 O(|x|+|y|) , 결정의 방법이 ad<cb 곱셈 (또는 부서), 미리 형성하지 않고 adcb . 아니면 방법이 없다는 증거가 있습니까?
  2. 분모를 곱하는 것보다 유리수를 비교하는 더 빠른 방법이 있습니까?

1
@PKG이지만 곱셈은 선형 시간보다 오래 걸립니다. 이 질문에 더 빠른 것을 원한다고 생각합니다.
Joe

1
까다로운 경우는 한 간격에 다른 간격이 포함 된 경우입니다 (예 : [a,d][b,c] .
PKG

1
와 의 부호가 같다고 암시 적으로 가정합니다 . 그렇지 않으면 불평등 방향이 바뀝니다. dbd
Ran G.

1
(1) 곱셈은 거의 선형 적입니다 (Fürer 알고리즘 검색). (2) 적어도 대수적 숫자 이론의 맥락에서 "합리적 정수"는 실제로는 단지 정수를 의미한다. "합리적"또는 "합리적 수"라고 말하고 싶습니다.
Yuval Filmus

1
명백한 중복 참조 유리수를 비교하는 방법?
vzn

답변:


5

나의 현재 연구 :

몇 가지 일반적인 규칙에 대한 초기 시도

합리적 비교를 해결하기위한 몇 가지 일반적인 규칙을 만들 수 있습니다.

모든 긍정적 인 가정하면 :a,b,c,d

a<bcdab<cd
이것은 기본적으로 왼쪽이 1보다 작고 오른쪽이 1 이상이면 왼쪽이 오른쪽보다 작음을 의미합니다 측면. 같은 맥락에서:

abcdabcd

다른 규칙 :

(b>d)(ac)[ab<cd]
분모가 클수록 숫자는 작고,이 규칙은 논리적 인 것으로 생각합니다. 분자 일수록 숫자가 커집니다. 좌측은 더욱 분모는지 없었는 경우 작은 분자를 좌측 작은 것이다.

여기서부터는 위의 규칙으로 문제를 해결하거나 질문을 되돌릴 수 있기 때문에 라고 가정합니다 , 우리는 어쨌든이 조건으로 끝납니다.ca<cb<dcd<?ab

규칙 : This 규칙은 기본적으로 분모에서 분자를 빼고 분자로 결과를 설정하여 동등한 문제를 얻을 수 있다고 말합니다. 나는 증거를 남기지 않을 것이다.

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

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

이 규칙을 사용하면 동등한 문제에 대해 오른쪽 분자와 분모에서 왼쪽 분자와 분모를 뺄 수 있습니다.

물론 스케일링이 있습니다.

akbk<cd[ab<cd]|a<c,b<d
당신 스케일링을 사용하여 위의 빼기 규칙을 더 중요하게 만들 수 있습니다.

이 규칙을 사용하면 사물을 가지고 놀면서 반복적으로 적용 할 수 있습니다. 그러나 스마트 한 조합으로 숫자가 가깝고 병리학적인 경우가 있습니다.

이전 규칙을 적용하면 이러한 모든 문제를 로 줄일 수 있습니다

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

때때로 당신은 때때로 이것을 직접 해결할 수 있습니다. 병리학 적 사례는 일반적으로 다음과 같은 형태입니다.

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

그런 다음 뒤집어서 같은 결과를 얻습니다. 규칙 + 플립을 적용 할 때마다 숫자 / 비트가 줄어 듭니다. 병리학 적 사례에서 번 (각 자릿수 / 비트 당 한 번 규칙을 적용하지 않으면 AFAICT, 신속하게 해결할 수 없습니다 .O(n)

열린 문제 ??

이 문제는 현재 열려있는 일부 문제보다 어렵다는 것을 깨달았습니다.

더 약한 문제는 다음을 결정하는 것입니다.

ad=?bc

그리고 더 약한 :

ad=?c

이것은 곱셈확인 하는 열린 문제입니다 . 을 결정할 방법이 있다면 더 약합니다 이면 쉽게 결정할 수 , 알고리즘을 두 번 테스트하여 , . 어느 쪽이든 참이면, 그 입니다.ad<?bcad=?bcad<?bcbc<?adadbc

이제 는 적어도 1986 년에 공개 된 문제였습니다.ad=?c

곱셈과 나눗셈의 복잡성. 매우 간단한 방정식 ax = b로 시작합시다. 정수에 대해 고려할 때, 용해도를 테스트하고 솔루션 x를 찾는 것은 나머지 0으로 정수 나누기에 의해 가능합니다. 주어진 솔루션 x를 확인하기 위해 정수 곱셈이면 충분하지만 확인 방법이 더 빠른지 여부는 흥미로운 열린 문제입니다.

계산 복잡도 측면에서 방정식을 푸는 ARNOLD SCHÖNHAGE

매우 흥미롭게도 그는 행렬 곱셈확인 하는 문제를 언급했습니다 .

매트릭스 곱셈의 검증, 즉 주어진 C에 대해 AB = G를 확인하는 것이 더 빨리 수행 될 수 있는지에 대한 흥미로운 질문이기도합니다.

계산 복잡도 측면에서 방정식을 푸는 ARNOLD SCHÖNHAGE

이것은 이후에 해결 되었으며, 무작위 알고리즘 을 사용하여 시간 에서 실제로 확인할 수 있습니다 ( 은 입력 행렬의 크기이므로 기본적으로 선형 시간 임). 입력 크기). Karatsuba 정수 곱셈과 그에 따른 행렬 곱셈 알고리즘의 유사성을 고려할 때, 특히 곱셈의 정수 곱셈을 행렬 곱셈으로 줄일 수 있는지 궁금합니다. 그런 다음 어떤 식 으로든 정수 곱셈에 행렬 곱셈 검증 알고리즘을 활용할 수 있습니다.O(n2)n×n

어쨌든, 이것은 여전히 ​​나의 지식, 열린 문제, 의 더 강한 문제 가 반드시 열려 있습니다. 평등 검증 문제를 해결하면 비교 불평등 검증 문제와 관련이 있는지 궁금합니다.ad<?cd

우리의 문제의 약간의 변형은 분수가 가장 낮은 항으로 줄어든다는 것입니다. 이 경우 인지 쉽게 알 수 있습니다 . 이것이 분수 감소에 대한 비교 검증과 관련이 있습니까?ab=?cd

좀 더 미묘한 질문, 만약 우리가 하게 테스트 할 수 있다면 , 이것은 테스트까지 확장 ? "두 가지 방법"을 어떻게 사용할 수 있는지 모르겠습니다 .a d ? = c a d ? < c dad<?cad=?cad<?cd

관련 :

  • 유한 오토마타에 의한 비정규 언어의 대략적인 인식

    그들은 대략적인 곱셈과 무작위 검증에 대한 작업을 수행합니다.

  • math.SE : 곱하지 않고 두 곱셈을 비교하는 방법?
  • 다항식 시간에서 원하는만큼 를 전처리 할 수 ​​있다고 가정하면 선형 시간으로 를 해결할 수 있습니까?a b = ccab=c
  • 선형 시간 비 결정적 정수 곱셈 알고리즘이 있습니까? http://compgroups.net/comp.theory/nondeterministic-linear-time-multiplication/1129399를 참조 하십시오

    n 비트 수에 O (n log (n) log (log (n))) 복잡도와 곱하기위한 잘 알려진 알고리즘이 있습니다. 그리고 적어도 전체 입력을 살펴 봐야하기 때문에 O (n)보다 더 잘할 수 없습니다. 내 질문은 : "비결정론 적"알고리즘의 적절한 클래스를 위해 실제로 O (n)에 도달 할 수 있는가?

    더 정확하게 말하면, 2 개의 n 비트 이진수 "a"와 "b"와 2n 비트 숫자 "c"를 받아들이고 O (n) 시간에 "a * b = c"인지 알려주는 알고리즘이 있습니까? 그렇지 않은 경우 알고리즘이 선형 시간에 제품을 테스트하는 데 사용할 수있는 다른 형태의 인증서 C (a, b, c)가 있습니까? 선형 시간이 아니라면 제품을 테스트하는 것보다 제품을 테스트하는 것이 문제가 아닌가? 이 라인을 따라 알려진 결과는 환영받을 것입니다.

    남자.

    ―johnh4717


1

반박에 대한 부분적인 시도 가 있습니다. 결정자에서 (일정한 수의 덧셈과 뺄셈과 상수 wrt 사전 정의 된 숫자 만 사용할 수 있다고 가정하십시오 . 다시 말해, 결정자에서 일정한 수의 , 등을 수행 할 수 있습니다 . 우리가 계산할 수있는 유일한 양은 여기서 는 미리 정의 된 상수입니다. 하는 것으로 시간에 계산 될 수있다 . m o d 2 m o d 3 q = k 1 a + k 2 b + k 3 c + k 4 d = k i a k q O ( | a | )modmod 2mod 3q=k1a+k2b+k3c+k4d=kiakqO(|a|)

편집 이 결정자는 비트 iff 를 결정하기 위해 합니다. 를 점으로 고려하십시오 . 비트 는 4 차원의 쌍곡선 인 표면 의 위치에 의해 결정된다 . 입력 공간에 점 있는 경우 위의 결정자는이 입력 점의 경계 거리 내에있는 점, 즉 그 점 계산할 수 있습니다 등. 공간에서 직육면체를 정의합니다.a d > b c a , b , c , d R 4B:B=1ad>bca,b,c,dR4a d = b c ( a , b , c , d ) q : | q - a | = k 1 ,Bad=bc(a,b,c,d)q:|qa|=k1,

입방체에서 표면까지의 거리는 일반적으로 제한이 없으므로 결정자가 표면을 계산할 수 없습니다.


응답하지 않아서 죄송합니다. 나는 이것이 단순히 내 이해 이상이라고 생각하며 그 동안 가능한 대답을 연구하는 데 바빴습니다.
Realz Slaw

1

좋은 질문. 당신은 자신감의 수준을 수락 하시겠습니까?

아마도 대략적인 나누기를 할 것입니다. 즉

a / b의 경계 근사 지수를 계산하려면 ceil (log_2 (b)) 및 floor (log_2 (b))를 기준으로 a를 오른쪽으로 이동하십시오. 그런 다음 정확한 몫이이 두 값 사이에 있다는 것을 알고 있습니다.

그런 다음 네 개의 정수의 상대적 크기에 따라 특정 사례를 배제하고 100 % 신뢰를 얻을 수 있습니다.

2 이외의 기수에 대한 절차를 반복 할 수 있으며, 이러한 동작의 연속으로 부호 / 타이 브레이크의 변화가 어떻게 든 관찰 될 때까지 신뢰 수준이 증가합니까?

이것이 방법의 첫 초안 스케치입니다.


내 "현재 연구"답변을 보면 이러한 규칙이이 효과에 영향을 미친다고 생각합니다. 첫 번째 규칙 중 하나에 도달하면 여러 번 100 % 신뢰를 얻을 수 있습니다. 최악의 경우, 마지막 규칙을 반복해서 반복합니다. 그러나 내 질문은 에서 결정적인 것 (또는 곱셈보다 더 나은 것, 또는 도이 질문을 만족시킬 것입니다) 또는 적어도 기하 급수적으로 확률이 작은 무작위 알고리즘에 관한 것입니다. 실패. O ( N 로그 N )O(n)O(nlogn)
Realz Slaw

또한 이것이 공개 된 문제인지 확인할 수 있고 (내 "현재 연구"답변, 공개 문제 ?? 섹션 참조)를 검증하는 것보다 본질적으로 어렵지 않은지 또는 다른 흥미로운 기존 연구 또는 결과가있는 경우 이것에 관해서는, 그것도 수용 가능한 대답이 될 수 있습니다. ab=c
Realz Slaw

1

[고가의] 곱셈을 수행 할 필요없이 ad <cb를 결정하는 방법이 있습니까?

확실한.

아이디어 : 10 진수 확장을 비트 단위로 비교하십시오.

유일한 불쾌한 점은 평등을 먼저 배제해야한다는 것입니다. 그렇지 않으면 우리는 종결하지 않을 수 있습니다.
정수 부분을 먼저 비교하는 것이 편리하기 때문에 유용합니다.

이걸 고려하세요:

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
}

점을 유의 do-while루프가 숫자가 불평등 때문에 종료 할 수 있습니다. 그러나 우리는 그것이 얼마나 오래 걸리는지 모른다. 숫자가 매우 가까운 경우 시간이 걸릴 수 있습니다.

분명히 값 비싼 곱셈은 없습니다. 우리가 필요로하는 것은 지명자에 을 곱하는 것입니다 . 특히 와 명시 적으로 계산하지 않았습니다 .a d c b10adcb

이게 빠른가요? 아마 아닙니다. gdc계산할 정수 divisons, modulos 및 s 가 많이 있으며, 반복 횟수가 비교하는 숫자 사이의 거리에 반비례하는 루프가 있습니다.


도우미 방법 :

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

나는 이것이 질문의 정신에 있다고 생각하지 않습니다. 처음에 와 계산 이미 질문에서 와 를 계산하는 것만 큼 많은 시간이 걸리며 , 질문에 "곱셈 (또는 나누기)없이 와 ". 또한 선형 시간 알고리즘을 요청합니다.이 알고리즘은 잠시 동안 실행되는 루프에 대한 귀하의 의견에 따라 그렇지 않습니다. c / d a d b c a d c ba/bc/dadbcadcb
David Richerby

@DavidRicherby Hm. 나는 주로 오버플로에 대해 생각하고 있었다. 여기에서 오퍼레이션은 큰 숫자를 생성 할 가능성이 적다.
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.