|
集合的next()和exists()开销都比较高,
所以前面的delete操作改成修改状态。
这样改动又能提高了半个数量级的性能。 - create or replace procedure q370d(arg integer default 1e6) is
- q integer;
- p integer;
- sm integer:=0;
- type typen1 is table of boolean index by pls_integer;
- type typen2 is table of typen1 index by pls_integer;
- frac typen2;
- begin
- for q in 3 .. sqrt(arg/2) loop
- for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
- frac(q)(p) := true;
- end loop;
- end loop;
- for q in 3..sqrt(arg/2)/2 loop
- for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
- for k in 2..sqrt(arg/2)/q loop
- frac(q*k)(p*k):=false;
- end loop;
- end loop;
- end loop;
- sm:=0;
- for q in 3 .. sqrt(arg/2) loop
- for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
- if frac(q)(p) then
- sm:=sm+floor(arg/(p*(p+q)+q*q));
- end if;
- end loop;
- end loop;
- sm:=sm+ floor(arg/3);
- dbms_output.put_line('total: '||sm);
- 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>
|
|