2014-04-02 3 views
0

Java 코드에서 다음과 같은 "while"루프가 있습니다. 내 코드의 모든 변수는 BigIntegers입니다.무한 루프. Java BigInteger

BigInteger d=new BigInteger("1"); 
BigInteger e=new BigInteger("3"); 
BigInteger phi1=new BigInteger("6336"); 
while(true) 
{ 
    if(((d.multiply(e)).mod(phi1)).equals(BigInteger.ONE)) 
     break; 
    d=d.add(BigInteger.ONE); 
    //System.out.println(d); 
} 

루프는이 경우 무한히 실행됩니다. 하지만 다음의 조건에 휴식을 추가 할 :

if((d*e)%phi1==1) 
    break; 

나는 어디에서 잘못을 얻고있다

if(((d.multiply(e)).mod(phi1)).equals(BigInteger.ONE)) 
    break; 

로 BigInteger로 변환 한 어떤? 루프가 무한히 실행되는 이유는 누구나 알 수 있습니까?

+0

숫자는 3입니다. 6 + 3 + 3 + 6 = 18 % 3이 0이므로 숫자는 3의 인수입니다. → 조건이 충족되지 않습니다. – Maroun

+0

아니면 각 자릿수가 3의 배수인지 알 수 있습니다. : P 6336/3 = 2112 –

답변

9

63363의 배수이므로 break에 대한 조건은 결코 사실이 아닙니다.

무한 루프가 불가피합니다.

+1

계산 중 : _ ( – Maroun

+1

더하기 : ((d.multiply (e)). mod (phi1)) .equals (BigInteger.ONE))은 d.multiply (e) .mod (phi1) .equals (BigInteger.ONE)와 동일하므로 리팩토링하여 쉽게 읽을 수 있습니다. –

+0

@MarounMaroun → – devnull

0

3 * d를 6336으로 나누고 나머지 r을 확인합니다. k는 분할 결과를하자 : 따라서 될 수 없다,

3d = k*6336 + r 
=> r = 3*(d - 2112*k) 

나머지는 항상 3의 배수 인 것을 의미한다 "숫자 % 3의 합이"다음 제로, 1.