2012-07-24 4 views
0

데이터 파일 F_j가 있습니다. 각 파일에는 소수점 이하 자릿수가있는 숫자 목록이 들어 있습니다. 각 파일은 내가 파일을 F_j이산화 과정 찾기

내가 가지고 올 수있는 솔루션 불연속 단계 d_j를 찾으려면 약간의 연속 변수와 의 이산화 측정을 포함

  • 수 (n_j)를 찾아, 각 F_j를 들어 소수 자릿수;
  • F_j의 각 숫자에 10^{n_j}을 곱하여 정수를 얻습니다.
  • 전체 목록에서 가장 큰 공약수를 찾습니다.

저는 Matlab에서 n_j를 찾는 우아한 방법을 찾고 있습니다.

또한 긴 정수 목록의 gcd를 찾는 일은 어려워 보입니다. 더 좋은 아이디어가 있습니까?

+0

파일 당 하나의 번호 만 있습니까? 또는 파일의 모든 숫자가 소수점 뒤에 오는 동일한 길이가 될 것입니까? –

+0

이산화는 소수점 이하 자릿수와 동일하지 않습니다! –

답변

0

긴 숫자 목록의 gcd를 찾는 것은 도 아닙니다. 하드입니다. 목록 크기만큼 선형 적으로 처리 할 수 ​​있습니다. 운이 좋으면 시간이 지나면 직선보다 훨씬 적게 할 수 있습니다. 기본적으로이 때문에 :

gcd(a,b,c) = gcd(gcd(a,b),c) 

에 관계없이 다른 수의 크기에 다음 중 하나 a=1 또는 b=1gcd(a,b)=1 경우

. 당신이 번호 목록이있는 경우

그래서 xs 당신은

g = xs(1); 

for i = 2:length(xs) 
    g = gcd(x(i),g); 
    if g == 1 
    break 
    end 
end 

이 변수 g 이제 목록의 최대 공약수를 저장할 할 수 있습니다.

0

다음은 내가보고자하는 숫자가 있으면 GCD를 얻는 데 도움이 될 것이라고 생각되는 몇 가지 샘플 코드입니다.

A = [15 30 20]; 
A_min = min(A); 
GCD = 1; 
for n = A_min:-1:1 
    temp = A/n; 
    if (max(mod(temp,1))==0) 
     % yay GCD found 
     GCD = n; 
     break; 
    end 
end 

여기 기본 개념은 모든 숫자 자체 물론 1 =)로 나누어 때문에 기본 GCD는 항상 1이 될 것입니다. GCD는 또한 목록에서 가장 작은 숫자보다 클 수 없습니다. 따라서 가장 작은 숫자부터 시작하여 1을 음수로 표시합니다. 이것은 이미 숫자를 정수형으로 변환했다고 가정합니다. 십진수가이를 버립니다!

숫자가 정수인지 확인하려면 1의 모듈을 사용하고, 그렇지 않으면 0보다 큰 소수 나머지가 있습니다. 음수를 처리해야 할 것으로 예상되는 경우 이 테스트를 조정해야합니다!

그 외, 처음으로 목록의 모듈러스 (mod 1)가 모두 0 인 숫자를 찾으면 GCD를 찾았습니다.

즐기십시오!