Volder
Member
Откуда: Москва
Сообщений: 471
|
| RA\/EN | Слабый у вас там сервачок, первый мой вариант (без MODEL) разложил 1,000,000,000,000 за 200 секунд (в "примерно 3 минуты" уложился )
| сервачок тут у меня в виде ноутбука, причем потрепанного)))
| RA\/EN | Вариант с MODEL, однако, однозначно помрет на большом простом числе. Но его можно доработать по аналогии с первым (это вариант 2.5 ): |
точно не помню ограничения на количество итераций, но на 1е10 уже при парсе запроса помирает))
| RA\/EN | | Заодно нашел глючок в первом варианте: для простых показывает NULL. | ага я про это же, что "в корне ошибка" - попутал
ну раз уж мой вариант все равно переплюнут, вот что было изначально:
SQL> var n number
SQL> exec :n:=99991
PL/SQL procedure successfully completed
n
---------
99991
SQL> set timing on
SQL>
SQL> with t as (select level l from dual connect by level <= :n),
2 --
3 t1 as (select l prim_num from
4 (select * from t
5 model
6 dimension by (l dim)
7 measures (l,2 temp)
8 rules iterate (1e8) until (power(temp[1],2)>:n)
9 (l[DIM>TEMP[1]]=decode(mod(l[CV()],temp[1]),0,null,l[CV()]),
10 temp[1]=min(l)[dim>temp[1]])
11 )
12 where l is not null)
13 --
14 select '('||prim_num||'^'||pow||')' prim_factors from (
15 select * from t1
16 model
17 dimension by (rownum rn)
18 measures(prim_num, :n val, 0 pow)
19 rules iterate(1000) until (val[1]=1)
20 (pow[any] order by rn = decode(mod(val[1],prim_num[CV()]),0,pow[CV()]+1,pow[CV()]),
21 val[rn>1] order by rn = decode(mod(val[CV()-1],prim_num[CV()]),0,val[CV()-1]/prim_num[CV()],val[CV()-1]),
22 val[1]=min(val)[any]))
23 where rn>1 and pow>0
24 /
PRIM_FACTORS
--------------------------------------------------------------------------------
(99991^1)
Executed in 146.25 seconds
n
---------
99991
SQL> exec :n:=999
PL/SQL procedure successfully completed
Executed in 0 seconds
n
---------
999
SQL>
SQL> with t as (select level l from dual connect by level <= :n),
2 --
3 t1 as (select l prim_num from
4 (select * from t
5 model
6 dimension by (l dim)
7 measures (l,2 temp)
8 rules iterate (1e8) until (power(temp[1],2)>:n)
9 (l[DIM>TEMP[1]]=decode(mod(l[CV()],temp[1]),0,null,l[CV()]),
10 temp[1]=min(l)[dim>temp[1]])
11 )
12 where l is not null)
13 --
14 select '('||prim_num||'^'||pow||')' prim_factors from (
15 select * from t1
16 model
17 dimension by (rownum rn)
18 measures(prim_num, :n val, 0 pow)
19 rules iterate(1000) until (val[1]=1)
20 (pow[any] order by rn = decode(mod(val[1],prim_num[CV()]),0,pow[CV()]+1,pow[CV()]),
21 val[rn>1] order by rn = decode(mod(val[CV()-1],prim_num[CV()]),0,val[CV()-1]/prim_num[CV()],val[CV()-1]),
22 val[1]=min(val)[any]))
23 where rn>1 and pow>0
24 /
PRIM_FACTORS
--------------------------------------------------------------------------------
(3^3)
(37^1)
Executed in 0.25 seconds
n
---------
999
SQL> PS сколько по времени на вашем сервачке первый запрос открутится? |