楼主: 〇〇

Project Euler Problem 276, 268, 347

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
111#
 楼主| 发表于 2012-2-9 12:51 | 只看该作者
〇〇 发表于 2012-2-9 12:18
如果q为质数,那么范围内的所有p都是可以的,也可以不计算
SQL> exec q3702(1000)
4:6:9

但是质数之占1/ln(n),影响有限

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
112#
发表于 2012-2-9 13:09 | 只看该作者
〇〇 发表于 2012-2-9 12:51
但是质数之占1/ln(n),影响有限

是的。
按互质的一些规律去排除一些数很容易, 比如:
*质数与任何数互质
*相邻数互质
*相邻的奇数互质。。。

但都减少不了多少工作量。 因为这些数即使调用gcd函数,也是很快能循环结束的。

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
113#
发表于 2012-2-9 15:41 | 只看该作者
用Q73的筛法( http://www.itpub.net/forum.php?m ... 69&pid=17121256 )来做, 因为避免了gcd和mod操作,能稍快些。
  1. create or replace procedure q370c(arg number default 1e6) is

  2.   q integer;
  3.   p integer;
  4.   sm integer:=0;
  5.   type typen1 is table of boolean index by pls_integer;
  6.   type typen2 is table of typen1 index by pls_integer;
  7.   frac typen2;
  8. begin
  9.   
  10.   for q in 3 .. sqrt(arg/2) loop
  11.     for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
  12.         frac(q)(p) := true;
  13.     end loop;
  14.   end loop;
  15.   q:=frac.first;
  16.   while q<=sqrt(arg/2)/2 and q is not null loop
  17.     p:=frac(q).first;
  18.     while p is not null loop
  19.       for k in 2..sqrt(arg/2)/q loop
  20.         if frac.exists(q*k) then frac(q*k).delete(p*k); end if;
  21.       end loop;
  22.       p:=frac(q).next(p);
  23.     end loop;
  24.     q:=frac.next(q);
  25.   end loop;
  26.   sm:=0;
  27.   q:=frac.first;
  28.   while q is not null loop
  29.     p:=frac(q).first;
  30.     while p is not null loop
  31.       --if p+q > q*q/p then
  32.       sm:=sm+floor(arg/(p*p + p*q + q*q));
  33.       --end if;
  34.       p:=frac(q).next(p);
  35.     end loop;

  36.     q:=frac.next(q);
  37.   end loop;
  38.   sm:=sm+ floor(arg/3);
  39.   dbms_output.put_line('total: '||sm);
  40.   end q370c;
复制代码
SQL> exec q370c(1e6)

total: 861805

PL/SQL procedure successfully completed

Executed in 0.297 seconds

SQL> exec q370c(1e7)

total: 9712598

PL/SQL procedure successfully completed

Executed in 4.446 seconds


OO上面那个p/q>(sqrt(5)-1)/2=0.618,很强,有了这个, 试验了下不加a+b>c的条件,也能得到正确结果,但不知这样可靠不可靠。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
114#
 楼主| 发表于 2012-2-9 16:13 | 只看该作者
tree_new_bee 发表于 2012-2-9 15:41
用Q73的筛法( http://www.itpub.net/forum.php?mod=redirect&goto=findpost&ptid=1383369&pid=17121256 )来 ...

只要gcd法1/4的时间,半个数量级

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
115#
发表于 2012-2-9 20:16 | 只看该作者
tree_new_bee 发表于 2012-2-9 13:09
是的。
按互质的一些规律去排除一些数很容易, 比如:
*质数与任何数互质

质数与任何数互质
————————————这个说法不对哦

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
116#
发表于 2012-2-9 21:08 | 只看该作者
集合的next()和exists()开销都比较高,
所以前面的delete操作改成修改状态。
这样改动又能提高了半个数量级的性能。
  1. create or replace procedure q370d(arg integer default 1e6) is
  2.   q integer;
  3.   p integer;
  4.   sm integer:=0;
  5.   type typen1 is table of boolean index by pls_integer;
  6.   type typen2 is table of typen1 index by pls_integer;
  7.   frac typen2;
  8. begin
  9.   for q in 3 .. sqrt(arg/2) loop
  10.     for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
  11.         frac(q)(p) := true;
  12.     end loop;
  13.   end loop;
  14.   for q in 3..sqrt(arg/2)/2 loop
  15.     for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
  16.       for k in 2..sqrt(arg/2)/q loop
  17.           frac(q*k)(p*k):=false;
  18.       end loop;
  19.     end loop;
  20.   end loop;
  21.   sm:=0;
  22.   for q in 3 .. sqrt(arg/2) loop
  23.     for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
  24.      if frac(q)(p) then
  25.       sm:=sm+floor(arg/(p*(p+q)+q*q));
  26.      end if;
  27.    end loop;      
  28.   end loop;
  29.   sm:=sm+ floor(arg/3);
  30.   dbms_output.put_line('total: '||sm);
  31.   end q370d;
复制代码
这次甚至可以尝试1e8了:

SQL> exec q370d(1e6)

total: 861805

PL/SQL procedure successfully completed

Executed in 0.094 seconds

SQL> exec q370d(1e7)

total: 9712598

PL/SQL procedure successfully completed

Executed in 0.796 seconds

SQL> exec q370d(1e8)

total: 108073540

PL/SQL procedure successfully completed

Executed in 8.127 seconds

SQL>



使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
117#
发表于 2012-2-10 10:31 | 只看该作者
lastwinner 发表于 2012-2-9 20:16
质数与任何数互质
————————————这个说法不对哦

呵呵,有误。 其实我想说的是质数与任何比它小的数互质。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表