2009-04-28 9 views
3

부분적인 곱셈처럼 보이는 것에 대한 통찰력이 필요합니다. 부분적으로 또는 래핑 된 곱셈 -이 함수를 식별 할 수있는 사람이 있습니까?

unsigned long long DoBusyWork(unsigned long long x, unsigned long long y, int n) 
{ 
    while (n--) 
      x = NotMultiply(x,y); 
    return x; 
} 

는이 결과를 계산하기위한 어떤 단축키가 있습니까 다음과 같이

#define LOW(x) ((x)&0xffffffff) 
#define HIGH(x) ((x)>>32) 
unsigned long long NotMultiply(unsigned long long x, unsigned long long y) 
{ 
    return HIGH(x)*HIGH(y) + LOW(x)*LOW(y); 
} 

이 기능은 여러 번 반복된다?
x == y 인 경우는 어떻게됩니까? 도움이 될 추가 정보

모든 링크는 ..

+3

"DoBusyWork"라는 이름이 단서가 아닌 것이 확실합니까? 그것은 목표가 유용한 것을 계산하는 것이 아니라 시간을 낭비한다는 것을 의미합니다. – RBerteig

답변

0

LOW은 아래 32 비트를 취할 노력하고있다. 높음은 다음 32 비트를 32 비트 아래로 이동시키는 것입니다. 전체 NotMultiply 루틴은 x와 y의 하위 32 비트를 함께 다중화하여 상위 32 비트에 추가하려고합니다. DoBusyWork는 n 번합니다.

x == y이면 HIGH (x) ² + LOW (x) ²이됩니다.

나는 왜 그들이 그렇게하고 싶지는 모르겠다. 이것은 x와 y의 위쪽과 아래쪽 반쪽을 서로 뭉개 버리는 것입니다.

1

이상한 해시 계산처럼 보입니다. 두 숫자의 하위 32 비트를 취해이를 곱하고 더 높은 32 비트를 가져 와서 (더 낮은 위치로 이동 한 다음) 곱한 다음 합을 반환합니다.

나는 당신이 그것을 더 간단하게 만들 수 있다고는 생각하지 않지만 아마도 더 빠를 것이라고 생각한다. while 루프는 동일한 값을 다시 반환하면 중단 될 수 있습니다.

unsigned long long DoBusyWork(unsigned long long x, unsigned long long y, int n) 
{ 
    long long previousX = x; 
    while (n--) 
    { 
      x = NotMultiply(x,y); 
      if (x == previousX) break; 
      previousX = x; 
    } 
    return x; 
} 

루프를 일찍 끝내야할지 잘 모르겠다.

1

DoBusyWork (@RBerteig가 제안했듯이 이름이 적색 플래그 임) 컴파일러가 통화 중 루프를 최적화하지 않도록 할 수 있습니다.

이러한 컴파일러는 너무 똑똑해 지기도하고 때로는 "오! 루프가 필요 없어요! 계산하려고하는 것을 봅니다!" 프로그래머로서의 당신의 진정한 관심에도 불구하고.

1

이것은 초기 형태의 난수 생성기이며 미니 컴퓨터 및 소형 메인 프레임에서 자주 사용됩니다. 그 후

lltmp = DoBusyWork(seedold, seednew, finetune); 
seedold = seednew; 
seednew = lltmp; 

을 PRNG로 사용 :

unsigned long long seedold = 0xA5A5A5A5A5A5A5A5; 
unsigned long long seednew = 0X5A5A5A5A5A5A5A5A; 
unsigned long long lltmp; 
int finetune; 

키보드 또는 이와 유사한 진정으로 임의하지만 느린 방법 타이밍에 의해 임의 화 finetune, 다음과 같이 한 번 호출 호출은 다음과 같이 표시 될 수 있습니다

lltmp = DoBusyWork(seedold, seednew, 1); 
seedold = seednew; 
seednew = lltmp; 

seednew를 PRN으로 사용하십시오.

폰 노이만은 "몬테카를로"테스트 응용 프로그램에 대해 이러한 종류의 계산을지지했지만 나중에 PRNG 출력 분석에 대해 더 많이 배웠을 때 마음이 바뀌 었습니다.

-Al.