페르마 인수분해 재귀구현

cppig1995의 이미지

FermatFactorize_Print 함수 (페르마 인수 분해) 를 구현했습니다.
그런데 컴파일은 되고 실행이 안되네요.
환경은 (몇 달째 우분투로 갈아엎지 못한) WinXP VC++ 6입니다.
실행을 하면 한참 기다립니다.

전 못찾겠어요.

도와주세요!!!

File attachments: 
첨부파일 크기
파일 Fermat.cpp1.71 KB
익명 사용자의 이미지

void FermatFactorize_Print(int Numeric)
{
	int p, q, m, n, i = Round(sqrt(Numeric));

	while(true)
	{
		double a = fabs(fmod(q = sqrt(i - Numeric), 1.0));

		if(a <= MEpsilon() * a)
		  p = static_cast<int> (a);
			
		i++;
	}
doldori의 이미지

Fermat 인수분해에 대해서는 아는 바가 없지만 무한루프 외에도 문제점이 있긴 하네요.

epsilon을 루프 안에서 매번 계산하는 것도 비효율적이거니와 MEpsilon() 함수도
필요 없습니다.
if(a <= numeric_limits<double>::epsilon() * a)

C++ 표준에는 sqrt(int) 형의 함수는 없습니다. 따라서 sqrt(0) 같은 식은
overloading resolution 과정에서 모호함을 발생시키므로 에러입니다.
명시적인 캐스팅을 써야겠습니다.

fmod(integer, 1.0)의 결과는 (이론적으로는) 항상 0이 됩니다.