下面是算法描述,我照着写了一个程序,不知为何确不能正确判断素数,居然31也不是素数,虽然这个算法是基于概率的,但是只会把不是素数的数判断为素数,怎么也不会把素数判断成合数,是不是小弟的程序哪里写错了,还是算法本身有问题,请高手指教!

下面是一个Rabin-Miller算法来对一个大数进行素性判断:
首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。

(1) 选择一个小于p的随机数a。
(2) 设j=0且z=a^m mod p
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
(4) 如果j>0且z=1, 那麽p不是素数
(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
(6) 如果j=b 且z<>p-1,不是素数
package helun;


import java.io.*;

public class disti {
double p,b,m;
    public disti(double p)
{    this.p=p;
getpbm();

}
    public void getpbm()
    {
        double t=p-1;
        b=0;
        while(t%2==0){b++;t=t/2;}
        m=(p-1)/Math.pow(2,b);        
        
        //System.out.println(p+"   "+b+"   "+"     "+m);
    }
    public boolean  test()
    {
        
     return dis();
        
        
    }
    public boolean  dis()
    {int flag=0;
    boolean init=true;
    for(int i=1;i<=10;i++)
    {double a=1;
    do{
        
a=Math.rint(p*Math.random());
//if(a!=0&&a!=p)System.out.println(a);

    }while(a<1||a==p);
        
        double j=0;
    double z=Math.pow(a, m)%p;
    if(z==1||z==p-1)continue;
    if(j>0&&z==1){flag=1;break;}
    while(init)
    {j++;
    if(j<b&&z!=p-1)
    {
        z=(z*z)%p;
        if(j>0&&z==1){flag=1;break;}
        
    }    else init=false;    
        
    }
    
        if(flag==1)break;
        if(z==p-1)continue;
        if(j==b&&z!=p-1)
        {flag=1;break;}
        
        
        
        
    }
    if(flag==1)return false;
    else return true;
        
        
    }
    
    
    public static void main(String[] args) {

double d=10;
BufferedReader ir=new BufferedReader(new InputStreamReader(System.in));
String s=null;
try{
    
    do{
s=ir.readLine();
d=Double.parseDouble(s);
    }while(d%2==0);


}
catch(Exception ex){}

        disti t =new disti(d);
if(t.test())System.out.println("是素数");
else System.out.println("不是素数");
        
    }

}