주어진 임의의 숫자 시스템에서 정수와 그 표현. 그 목적은 넘버 시스템의 기반을 찾는 것입니다. 예를 들어, 숫자는 10이고 표현은 000010입니다. 그런 다음 밑이 10이되어야합니다. 또 다른 예 : 숫자 21 표현은 0010101이고 밑은 2입니다. 하나 더 많은 예가 있습니다 : 숫자는 6이고 표현은 10100이고 그 다음에 밑은 sqrt (2)입니다. . 누구든지 그런 문제를 해결하는 방법을 알고 있습니까?숫자의 기준을 결정하는 방법은 무엇입니까?
답변
이 같은 알고리즘은 기본을 발견해야하고, 적어도 정수가 아닌베이스의 선택 범위를 좁힐해야합니다
- 이
N
이 정수하자R
가에서의 표현 일 신비의 기초. R
에서 가장 큰 자릿수를 찾고r
이라고합니다.- 귀하의 기지가 적어도
r + 1
입니다.base == (r+1, r+2, ...)
를 들어
- 귀하의 기지가 적어도
- 는
I
이I
이base
이 정체 불명의 기지 다음,N
에 해당base
- 경우 기본 해석
R
을 대표 할 수 있습니다. I
이N
보다 작 으면 다음 기준으로 시도하십시오.- 이
N
보다 큰 경우 기수는base - 1
과base
사이입니다.
- 경우 기본 해석
그것은 무차별 방법입니다,하지만 작동합니다. I
이 N
보다 상당히 작은 경우 base
을 하나 이상 증가시켜 조금 더 빠르게 할 수도 있습니다.
뭔가 : 같은 여러 사람이 언급 한 기억은, 어떤 기준의 숫자는
x = a[n]*base^n + a[n-1]*base^(n-1) + ... + a[2]*base^2 + a[1]*base + a[0]
같은 다항식으로 확장 할 수 있습니다
잠재적 인 기초를 평가할 때 전체 숫자를 변환 할 필요가 없습니다. 가장 큰 용어 인 a[n]*base^n
만 변환하여 시작하십시오. 이 값이 x
보다 큰 경우 사용자의 기본 크기가 너무 크다는 것을 이미 알고 있습니다. 그렇지 않으면 한 번에 하나의 용어를 추가하십시오 (최상위에서 최하위로 이동). 그렇게하면 기초가 잘못되었다는 것을 알게 된 후에도 계산 용어를 낭비하지 않아도됩니다.
잠재적 인 기반을 제거하는 또 다른 빠른 방법이 있습니다. 위의 다항식을 재 배열하고
(x - a[0]) = a[n]*base^n + a[n-1]*base^(n-1) + ... + a[2]*base^2 + a[1]*base
또는
(x - a[0]) = (a[n]*base^(n-1) + a[n-1]*base^(n-2) + ... + a[2]*base + a[1])*base
당신은
x
및
a[0]
의 값을 알고 얻을 수있는 것을 알 (이하 "사람"숫자는 상관없이 기지를 해석 할 수 있습니다). 이것은
(x - a[0])
이
base
으로 균등하게 나눌 수있는 여분의 조건을 제공합니다 (모든
a[]
값은 정수이므로).
(x - a[0]) % base
을 계산하고 0이 아닌 결과를 얻으면
base
은 올바른 기준이 될 수 없습니다.
고마워, 나는 비슷한 접근 방식을 사용하고 있지만, 다른 방식으로, 내가 보자. 내일 게시하십시오. –
여러분은'base'가 정수라고 가정합니다 (이 경우 문제는 간단합니다) ... 나는 같은 오류를 만들었지 만'@ evil.coder'는'base'가'sqrt (2)'인 예제를 제공합니다. . –
@Matthieu M.- 정수가 아닌 기본 경우이 알고리즘은 검색 공간을 두 개의 인접한 정수 사이의 간격으로 축소합니다. 이러한 범위를 알게되면 해당 범위 내에서 이진 검색을 수행하여 기반을 더욱 좁힐 수 있습니다. 그러나 근거가 비합리적인 경우이 프로세스는 수렴하지 않습니다. – bta
이것이 효율적으로 해결되는지 확실하지 않습니다. 난 그냥 임의의 기지를 선택하려고하면 기지가 주어진 결과가 작거나, 크거나, 숫자와 같은지보십시오. 작은 경우 큰베이스를 선택하십시오. 큰 경우 작은베이스를 선택하십시오. 그렇지 않은 경우 올바른베이스를가집니다.
___
\
number = /__ (digit[i] * base^i)
당신은 방금 base
을 찾을 수있다, 당신은 모든 digit[i]
을 알고, number
을 알고있다.
이 방정식을 푸는 것이 단순한 지 복잡한 지 여부는 연습 문제로 남겨 둡니다.
+1을 썼다. –
유니 코드를 배우십시오. 'Σ (digit [i] * base^i)' – slacker
총계 조건의 크기로 기본 시스템의 몇 가지 기본 속성을 무시합니다. 어떤'I','base^I> Σ (i = 0; i
이 당신에게 출발점 제공한다 :
1 * base^4 + 2 * base^2 + 3 = 42
이제 값을 얻을 수있는 방정식을 해결 :
이 수와 표현, 숫자 42 represenation "0010203"이됩니다에서 방정식을 만들기를 base
나는 모든 경우에 대해 대답을 줄 수는 없다고 생각합니다. 그리고 실제로 그렇게 생각할 이유가 있습니다! =)
베이스를 찾는 것은 Abel and Ruffini 의해 도시 된 바와 같이, 이것은 일반적으로 수행 할 수없는
a_6 b^5 + a_5 b^4 + a_4 b^3 + a_3 b^2 + a_2 b^1 + a_1 = x.
해결 수단베이스 (B)에 표시 a_6 a_5 a_4 a_3 a_2 a_1
와 숫자 X 주어. 더 짧은 숫자는 더 운이 좋을 수도 있지만 4 자리 이상이 포함되면 수식이 점점 추해집니다.
꽤 좋은 근사 알고리즘이 있습니다. here을 참조하십시오.
다른 기지를 시도하고 점검해야한다고 생각합니다. 능률적이기 위해서는 시작베이스가 최대치 (숫자) + 1이 될 수 있습니다. 초과 할 때까지이 값이 너무 작 으면 이진 검색을 사용하여 범위를 좁 힙니다. 이렇게하면 정상적인 상황에서 알고리즘이 O (log n)에서 실행되어야합니다.
나는 당신에게서 1 점을 얻었다. 고마워. –
다른 게시물 중 몇 개는 숫자가 나타내는 다항식의 근원을 찾아 냄으로써 해결책을 찾을 수 있다고 제안합니다. 물론 이것은 일반적으로 작동하지만 긍정적 인 정수뿐만 아니라 부정적이고 복잡한 기반을 생성하는 경향이 있습니다.
또 다른 접근법은 이것을 정수 프로그래밍 문제로 던지고 branch-and-bound를 사용하여 해결하는 것입니다.
그러나 나는 추측과 테스트의 제안이 더 비공식 제안보다 빠를 것이라고 생각합니다.
질문은 비 필수베이스의 예를 보여줍니다. 따라서 정수 프로그래밍은 적용 할 수 없습니다. –
정수의 경우에만 그리 어렵지 않습니다 (열거 할 수 있음).
21
및 그 표현 을 살펴 보겠습니다.
1 * base^4 <= 21 < (1+1) * base^4
는의 일부 기지의 번호를 생성하자
base low high
2 16 32
3 81 162
더 일반적으로, 우리는 N
가 Σ로 내가 * 기본 I을 표현합니다. 최대 전력 I
을 고려하는 대한 I는 null 이외 우리는이 : 정수베이스의 경우
a[I] * base^I <= N < (a[I] + 1) * base^I # does not matter if not representable
# Isolate base term
N/(a[I] + 1) < base^I <= N/a[I]
# Ith root
Ithroot(N/(a[I] + 1)) < base <= Ithroot(N/a[I])
# Or as a range
base in ] Ithroot(N/(a[I] + 1)), Ithroot(N/a[I]) ]
, 또는 당신이 알려진 가능한 기지의 목록이있는 경우, 나는 그들이 많은 수 있습니다 의심 가능성, 그래서 우리는 그들을 밖으로 시도 할 수 있습니다.
실제로는 Ithroot
을 N/(a[I] + 1)
으로 가져와 두 번째 컴퓨터를 계산하는 대신 여기에서 반복하는 것이 더 빠를 수 있습니다 (충분히 가까워 야합니다).하지만 그 직감에 대한 수학적 검토가 필요합니다.
실제로 (플로팅베이스를 찾으려고 할 때) 잘 생각해 보면 좀 더 어려울 것입니다.하지만 다음과 같은 불평등 (한두 가지 용어 포함)을 언제든지 수정할 수 있습니다. 같은 속성. 이 정수의 경우
asker의 예제 중 하나는 sqrt (2)로 발견되는 기본을가집니다. – AakashM
모든 숫자가 엄격하게 음수가 아니기 때문에 기본도 음수가 아닌 것으로 가정하면 고유 솔루션의 볼록 최적화 문제입니다.당신은 좋은 바운드와 쉽게 발견 된 바운드를 묘사했습니다. 이진 검색 (아마도 이등분식 대신에 보간법을 사용하는 것)은 거기에서 가져올 수 있습니다. –
@Matthieu : 바닥과 천장을 제거하면 AakashM이 지적한 것처럼 정수가 아닌 숫자로도 충분합니다. –
- 1. 하드웨어 사양에 따라 다양한 작업의 기준을 결정하는 방법은 무엇입니까?
- 2. 저장소를 결정하는 방법은 무엇입니까?
- 3. 배지 기준을 저장하는 가장 좋은 방법은 무엇입니까?
- 4. 점검 대상을 결정하는 방법은 무엇입니까?
- 5. 인증서의 루트를 결정하는 방법은 무엇입니까?
- 6. 유형 입력란을 결정하는 방법은 무엇입니까?
- 7. 개체의 크기를 결정하는 방법은 무엇입니까?
- 8. 게놈의 특성을 결정하는 방법은 무엇입니까?
- 9. 표현식 언어에서 숫자의 서식을 지정하는 방법은 무엇입니까?
- 10. 펄에서 숫자의 유효성을 검사하는 방법은 무엇입니까?
- 11. 주어진 숫자의 약수 목록을 얻는 방법은 무엇입니까?
- 12. 플로트를 정의하는 방법은 숫자의 절반입니까?
- 13. 숫자의 정수 부분 찾기
- 14. 새 항목의 주문을 결정하는 방법은 무엇입니까?
- 15. .NET에서 Progressbar의 증가 단계를 결정하는 방법은 무엇입니까?
- 16. 날짜 범위에서 날짜를 결정하는 좋은 방법은 무엇입니까?
- 17. 기본 키의 번호를 결정하는 표준 방법은 무엇입니까?
- 18. 확장자가 실행되는 폴더를 결정하는 방법은 무엇입니까?
- 19. 도우미와 서비스 네임 스페이스를 결정하는 방법은 무엇입니까?
- 20. ASP.net 캐시 항목의 크기를 결정하는 방법은 무엇입니까?
- 21. 앱 다운로드 날짜를 결정하는 방법은 무엇입니까?
- 22. 텍스트 품질을 자동으로 결정하는 방법은 무엇입니까?
- 23. 텍셀에서 OpenGL 텍스처의 크기를 결정하는 방법은 무엇입니까?
- 24. WebView의 항목을 클릭하는시기를 결정하는 방법은 무엇입니까?
- 25. Javascript에서 요소의 x- 경로를 결정하는 방법은 무엇입니까?
- 26. 런타임시 이진 이미지 아키텍처를 결정하는 방법은 무엇입니까?
- 27. 사이트 호스팅 제공 업체를 결정하는 방법은 무엇입니까?
- 28. ASPX 페이지의 클래스를 결정하는 방법은 무엇입니까?
- 29. gzipped 파일의 Content-Length를 결정하는 방법은 무엇입니까?
- 30. NewWindow 이벤트에서 열려고하는 URL을 결정하는 방법은 무엇입니까?
숙제? ........... –
간단합니다. 모든 숫자는 밑수 10입니다. – slacker
여러 가지 솔루션 (이 모든 것에 대해 언급하기에 좋음)은 이것을 일반적인 다항식으로 간주했습니다. 기본 시스템의 매우 특별한 제약을 무시했습니다. 'I', 'base^I> Σ (i [0, I [) (digit [i] * base^i)'이다. 이 속성을 사용하면 훨씬 쉽게 작업 할 수 있습니다. 여기에 방정식을위한 장소가 없기 때문에 대답으로 설명했지만 실제로 문제를 간소화합니다. –