주어진 과 ,
내 질문은 :
주어진
- 우리가 결정할 수 있습니다 가정하면 에서 , 결정의 방법이 곱셈 (또는 부서), 미리 형성하지 않고 및 . 아니면 방법이 없다는 증거가 있습니까?
- 분모를 곱하는 것보다 유리수를 비교하는 더 빠른 방법이 있습니까?
주어진 과 ,
내 질문은 :
주어진
답변:
나의 현재 연구 :
합리적 비교를 해결하기위한 몇 가지 일반적인 규칙을 만들 수 있습니다.
모든 긍정적 인 가정하면 :
다른 규칙 :
여기서부터는 위의 규칙으로 문제를 해결하거나 질문을 되돌릴 수 있기 때문에 라고 가정합니다 , 우리는 어쨌든이 조건으로 끝납니다.c
규칙 : This 규칙은 기본적으로 분모에서 분자를 빼고 분자로 결과를 설정하여 동등한 문제를 얻을 수 있다고 말합니다. 나는 증거를 남기지 않을 것이다.
이 규칙을 사용하면 동등한 문제에 대해 오른쪽 분자와 분모에서 왼쪽 분자와 분모를 뺄 수 있습니다.
물론 스케일링이 있습니다.
이 규칙을 사용하면 사물을 가지고 놀면서 반복적으로 적용 할 수 있습니다. 그러나 스마트 한 조합으로 숫자가 가깝고 병리학적인 경우가 있습니다.
이전 규칙을 적용하면 이러한 모든 문제를 로 줄일 수 있습니다
때때로 당신은 때때로 이것을 직접 해결할 수 있습니다. 병리학 적 사례는 일반적으로 다음과 같은 형태입니다.
그런 다음 뒤집어서 같은 결과를 얻습니다. 규칙 + 플립을 적용 할 때마다 숫자 / 비트가 줄어 듭니다. 병리학 적 사례에서 번 (각 자릿수 / 비트 당 한 번 규칙을 적용하지 않으면 AFAICT, 신속하게 해결할 수 없습니다 .
이 문제는 현재 열려있는 일부 문제보다 어렵다는 것을 깨달았습니다.
더 약한 문제는 다음을 결정하는 것입니다.
그리고 더 약한 :
이것은 곱셈 을 확인 하는 열린 문제입니다 . 을 결정할 방법이 있다면 더 약합니다 이면 쉽게 결정할 수 , 알고리즘을 두 번 테스트하여 , . 어느 쪽이든 참이면, 그 입니다.
이제 는 적어도 1986 년에 공개 된 문제였습니다.
곱셈과 나눗셈의 복잡성. 매우 간단한 방정식 ax = b로 시작합시다. 정수에 대해 고려할 때, 용해도를 테스트하고 솔루션 x를 찾는 것은 나머지 0으로 정수 나누기에 의해 가능합니다. 주어진 솔루션 x를 확인하기 위해 정수 곱셈이면 충분하지만 확인 방법이 더 빠른지 여부는 흥미로운 열린 문제입니다.
매우 흥미롭게도 그는 행렬 곱셈 을 확인 하는 문제를 언급했습니다 .
매트릭스 곱셈의 검증, 즉 주어진 C에 대해 AB = G를 확인하는 것이 더 빨리 수행 될 수 있는지에 대한 흥미로운 질문이기도합니다.
이것은 이후에 해결 되었으며, 무작위 알고리즘 을 사용하여 시간 에서 실제로 확인할 수 있습니다 ( 은 입력 행렬의 크기이므로 기본적으로 선형 시간 임). 입력 크기). Karatsuba 정수 곱셈과 그에 따른 행렬 곱셈 알고리즘의 유사성을 고려할 때, 특히 곱셈의 정수 곱셈을 행렬 곱셈으로 줄일 수 있는지 궁금합니다. 그런 다음 어떤 식 으로든 정수 곱셈에 행렬 곱셈 검증 알고리즘을 활용할 수 있습니다.
어쨌든, 이것은 여전히 나의 지식, 열린 문제, 의 더 강한 문제 가 반드시 열려 있습니다. 평등 검증 문제를 해결하면 비교 불평등 검증 문제와 관련이 있는지 궁금합니다.
우리의 문제의 약간의 변형은 분수가 가장 낮은 항으로 줄어든다는 것입니다. 이 경우 인지 쉽게 알 수 있습니다 . 이것이 분수 감소에 대한 비교 검증과 관련이 있습니까?
좀 더 미묘한 질문, 만약 우리가 하게 테스트 할 수 있다면 , 이것은 테스트까지 확장 ? "두 가지 방법"을 어떻게 사용할 수 있는지 모르겠습니다 .a d ? = c a d ? < c d
관련 :
그들은 대략적인 곱셈과 무작위 검증에 대한 작업을 수행합니다.
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
반박에 대한 부분적인 시도 가 있습니다. 결정자에서 (일정한 수의 덧셈과 뺄셈과 상수 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 | )
편집 이 결정자는 비트 iff 를 결정하기 위해 합니다. 를 점으로 고려하십시오 . 비트 는 4 차원의 쌍곡선 인 표면 의 위치에 의해 결정된다 . 입력 공간에 점 있는 경우 위의 결정자는이 입력 점의 경계 거리 내에있는 점, 즉 그 점 계산할 수 있습니다 등. 공간에서 직육면체를 정의합니다.a d > b c a , b , c , d R 4a d = b c ( a , b , c , d ) q : | q - a | = k 1 ,
입방체에서 표면까지의 거리는 일반적으로 제한이 없으므로 결정자가 표면을 계산할 수 없습니다.
좋은 질문. 당신은 자신감의 수준을 수락 하시겠습니까?
아마도 대략적인 나누기를 할 것입니다. 즉
a / b의 경계 근사 지수를 계산하려면 ceil (log_2 (b)) 및 floor (log_2 (b))를 기준으로 a를 오른쪽으로 이동하십시오. 그런 다음 정확한 몫이이 두 값 사이에 있다는 것을 알고 있습니다.
그런 다음 네 개의 정수의 상대적 크기에 따라 특정 사례를 배제하고 100 % 신뢰를 얻을 수 있습니다.
2 이외의 기수에 대한 절차를 반복 할 수 있으며, 이러한 동작의 연속으로 부호 / 타이 브레이크의 변화가 어떻게 든 관찰 될 때까지 신뢰 수준이 증가합니까?
이것이 방법의 첫 초안 스케치입니다.
[고가의] 곱셈을 수행 할 필요없이 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 b
이게 빠른가요? 아마 아닙니다. 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
}