主元素问题和素数测试

主元素问题 设T[1:n]是一个含有n个元素的数组。当|{i|T[i]=x}|>n/2时,称元素x是数组T的主元素。 public static boolean majority(int[]t, int n)    {// 判定主元素的蒙特卡罗算法        rnd = new Random();        int i=rnd.random(n)+1;        int x=t[i];    // 随机选择数组元素        int k=0;        for (int j=1;j<=n;j++)          if (t[j]==x) k++;        return (k>n/2);  // k>n/2 时t含有主元素    } public static boolean majorityMC(int[]t, int n, double e)    {// 重复é ù次调用算法majority        int k= (int) Math.ceil(Math.log(1/e)/Math.log(2));        for (int i=1;i<=k;i++)          if (majority(t,n)) return true;        return false;    } 对于任何给定的a>0,算法majorityMC重复调用?log(1/a)? 次算法majority。它是一个偏真蒙特卡罗算法,且其错误概率小于?。算法majorityMC所需的计算时间显然是O(nlog(1/a))。 ------------------------------------------------------------ 素数测试 Wilson定理:对于给定的正整数n,判定n是一个素数的充要条件是(n-1)!? -1(mod n)。 费尔马小定理:如果p是一个素数,且0<a<p,则ap-1(mod p)。 二次探测定理:如果p是一个素数,且0<x<p,则方程x2?1(mod p)的解为x=1,p-1。 private static int power(int a, int p, int n)    {// 计算 ap mod n,并实施对n的二次探测        int x, result;        if (p==0) result=1;        else {          x=power(a,p/2,n);  // 递归计算          result=(x*x)%n;            // 二次探测          if ((result==1)&&(x!=1)&&(x!=n-1))            composite=true;          if ((p%2)==1)      // p是奇数            result=(result*a)%n;          }        return result;} public static boolean prime(int n)     {// 素数测试的蒙特卡罗算法        rnd = new Random();        int a, result;        composite=false;        a=rnd.random(n-3)+2;        result=power(a,n-1,n);        if (composite||(result!=1)) return false;        else return true; } 算法prime是一个偏假3/4正确的蒙特卡罗算法。通过多次重复调用错误概率不超过(1/4) 4。这是一个很保守的估计,实际使用的效果要好得多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值