免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 6815 | 回复: 32
打印 上一主题 下一主题

[算法] 求解大数分解的有效率的算法?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-21 13:14 |只看该作者 |倒序浏览
各位DX
如题,
最指点一下。

论坛徽章:
0
2 [报告]
发表于 2006-07-21 13:35 |只看该作者
怎么个分解法阿?

论坛徽章:
0
3 [报告]
发表于 2006-07-21 22:37 |只看该作者
所有的数都是由素数组成的
分解就是说分为素数的乘积
eg:24=2*2*2*3
(此专指正整数)

论坛徽章:
0
4 [报告]
发表于 2006-07-21 22:48 |只看该作者
看过这里的好多精华文章
对N多版主相当佩服!!

论坛徽章:
0
5 [报告]
发表于 2006-07-21 23:01 |只看该作者
要最快的?还是简单点的?

论坛徽章:
0
6 [报告]
发表于 2006-07-21 23:33 |只看该作者
都要可以吗?
学习一下.

论坛徽章:
0
7 [报告]
发表于 2006-07-21 23:35 |只看该作者
明天抽空写一个,今天台湾了。

论坛徽章:
0
8 [报告]
发表于 2006-07-21 23:37 |只看该作者
好的
谢谢

论坛徽章:
0
9 [报告]
发表于 2006-07-22 00:43 |只看该作者
写了一个
可惜不能处理(1<<56)以上的
不知到DX们有什么解决方法没有
#include "stdio.h"
#include "math.h"
f(__int64 n)
{
        __int64 i, j=sqrt(n);
        for(i=2;i<=sqrt(n)+1;i++)
        {
                if(n%i==0)
                        printf("%d  ",i),
                        n/=i,
                        j=sqrt(n),
                        i=(i>j?2i-1));
        }
        if(n==1)return 0;
        if(i==j+2)printf("%d  ",n);
        return 0;
}
main()
{
        f(24203);
}

论坛徽章:
0
10 [报告]
发表于 2006-07-22 00:48 |只看该作者

  1. int table[14094]={
  2. 2,3,5,7,11,13,17,19,23,
  3. 25,29,31,35,37,41,43,47,49,53,
  4. 59,61,67,71,73,77,79,83,89,91,

  5. 太多了贴不上

  6. 65369,65371,65377,65381,65383,65389,65393,65399,65407,65411,
  7. 65413,65419,65423,65431,65437,65441,65447,65449,65453,65459,
  8. 65467,65473,65477,65479,65489,65491,65497,65501,65503,65507,
  9. 65509,65519,65521,65531,65533,};


  10. int defact(int n,int factor[],int num)
  11. {

  12.         int co=0;
  13.         int mark;
  14.         while(n>1) {

  15.                 mark=0;
  16.                 for(int i=0;i<14094;i++) {
  17.                         if(n%table[i]==0) {
  18.                                 n/=table[i];
  19.                                 mark=1;
  20.                                 if(co >= num) return -1;
  21.                                 factor[co++]=table[i];
  22.                                 break;
  23.                         }
  24.                 }

  25.                 if(!mark) {
  26.                         if(co >= num) return -1;
  27.                         factor[co++]=n;
  28.                         break; //这轮没找到因子
  29.                 }
  30.         };

  31.         return co;
  32. }

复制代码


这个我觉得最快了,上面是计算到65536的质数表,计算时只需要除每个质数就可以了,除的尽就是银子。这个算法适合计算量大的场合。少量计算就不要搞那么大的表了吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP