ç´ æ°åæ
以åæ¸ããè¨äºã§ã¯\(10^4\)ãããã®ãªã¼ãã¼ã¾ã§ããç´ æ°ãåæã§ãã¾ããã§ããããã¯ã¨ãªã工夫ãã¦\(10^7\)ãããã¾ã§ã¯è¡ããããã«ãªãã¾ãã
sucrose.hatenablog.com
以åã®ã¯ã¨ãª
ä¸ã®è¨äºã«æ¸ãã試ãå²ãã«ãã\(10^4\)åãããã¾ã§ãéçã®ã¯ã¨ãª
#standardSQL #æ°åãä½ã WITH numbers AS ( SELECT i FROM UNNEST(GENERATE_ARRAY(3, 20000, 2)) AS i ) #å²ãåããã試ã , divisible AS ( SELECT a.i , MOD(a.i, b.i) = 0 AS is_divisible FROM numbers AS a JOIN numbers AS b ON SQRT(a.i) + 1 > b.i ) #1åãå²ãåãã¦ããªããã®ãç´ æ° SELECT * FROM UNNEST([2, 3]) AS i UNION ALL SELECT i FROM divisible GROUP BY i HAVING NOT LOGICAL_OR(is_divisible) ORDER BY i
JOINãããã¦å¹³æ¹æ ¹ã¾ã§ã®å²ãæ°ãçæãã
å²ãæ°ãç¨æããããã«JOINãã¦ããã®ã§ãããããããã¦UNNEST(GENERATE_ARRAY(3, CAST(SQRT(i) + 1 AS INT64), 2)
ã«ããã¨\(10^7\)ã¾ã§ã®ç´ æ°åæãã§ããããã«ãªãã¾ããããã ã10åããããããã¾ã
è¨ç®éã¯\(O(n \sqrt n)\)ãããã«ãªã£ã¦ããã£ã½ãã§ã
#standardSQL #æ°åãä½ã WITH numbers AS ( SELECT i + 100000 * j AS i FROM UNNEST(GENERATE_ARRAY(1, 99999, 2)) AS i, UNNEST(GENERATE_ARRAY(0, 99)) AS j WHERE i + 100000 * j > 2 ) #å²ãåããã試ã , primes AS ( SELECT i , LOGICAL_OR(MOD(i, j) = 0) AS is_divisible FROM numbers, UNNEST(GENERATE_ARRAY(3, CAST(SQRT(i) + 1 AS INT64), 2)) AS j GROUP BY i HAVING NOT is_divisible ) SELECT * FROM UNNEST([2, 3]) AS i UNION ALL SELECT i FROM primes ORDER BY i
ã¨ã©ãã¹ããã¹ã®ãµããã«ä¼¼ãæ¹æ³ã使ã
ã¨ã©ãã¹ããã¹ã®ãµããã¯ç´ æ°ã®åæ°ã¯ç´ æ°ã§ãªããã®ã¨ãã¦å¼¾ãã¦ããæ¹æ³ã§ç´ æ°ãã©ããã®å¤å®ãä»ã®ã«ã¼ãã®çµæã«ä¾åãã¦ããã®ã§SQLã§æ¸ãã®ã¯é£ããã§ã
ãªã®ã§ãç´ æ°ã ãã«çµãã®ã¯è«¦ãã¦ãã¹ã¦ã®æ´æ°ã®åæ°ã«ã¤ãã¦è¨ç®ããSQLãæ¸ãã¾ã
ãã®ã¨ãã®è¨ç®éã¯èª¿åç´æ°ã«ãªãã®ã§ä»¥ä¸ã®ããã«ãªãã¾ã
$$O(\sum_{i=1}^n \frac{n}{i} = \frac{n}{1} + \frac{n}{2} + \frac{n}{3} + \frac{n}{4} + \frac{n}{5} + \dots + \frac{n}{n}) = O(n \log n)$$
ãã®æ¹æ³ã ã¨\(10^7\)ã¾ã§ã®ç´ æ°åæã3åå¼±ãããã§ã§ãã¾ã
#standardSQL #æ°åãä½ã WITH numbers AS ( SELECT i + 100000 * j AS i FROM UNNEST(GENERATE_ARRAY(0, 99999)) AS i, UNNEST(GENERATE_ARRAY(0, 99)) AS j WHERE i + 100000 * j > 1 ) , primes AS ( SELECT i * (j1 + 100000 * j2) AS x FROM numbers, UNNEST(GENERATE_ARRAY(0, MOD(CAST(FLOOR(9999999 / i) AS INT64), 100000))) AS j1, UNNEST(GENERATE_ARRAY(0, CAST(FLOOR(CAST(FLOOR(9999999 / i) AS INT64) / 100000) AS INT64))) AS j2 WHERE j1 + j2 > 0 GROUP BY x HAVING COUNT(*) = 1 ) SELECT x FROM primes ORDER BY x
ã¡ãã£ã¨ããé«éå
ããæ°ãç´ æ°ã§å²ãåããã¨ãã®æ大ã®ç´ å æ°ã¯å²ãããæ°ã®å¹³æ¹æ ¹ããå°ããã§ã
ãªã®ã§ã¨ã©ãã¹ããã¹ã®ãµãã風ã«æ°ãåæããã¨ãã«ãå¹³æ¹æ ¹ã¾ã§ã®ãããæ°ãèããã°ãããã¨ã«ãªãã¾ã
ãã®é«éåãå
¥ããã¨\(10^7\)ã¾ã§ã®ç´ æ°åæã1.5åãããã§ã§ãã¾ã
#standardSQL #æ°åãä½ã WITH numbers AS ( SELECT i + 100000 * j AS i FROM UNNEST(GENERATE_ARRAY(0, 99999)) AS i, UNNEST(GENERATE_ARRAY(0, 99)) AS j WHERE i + 100000 * j > 1 ) , divisible AS ( SELECT i * j AS x FROM numbers, UNNEST(GENERATE_ARRAY(1, CAST(FLOOR(IF(9999999 / i < SQRT(9999999) + 1, 9999999 / i, SQRT(9999999) + 1)) AS INT64))) AS j GROUP BY x HAVING COUNT(*) = 1 ) SELECT x FROM divisible ORDER BY x
ä»åã®è©±ã®ãªã
ã¯ã¨ãªã®é度çã«ã¯\(10^8\)å以ä¸ãè¡ãããï¼ã¨æã£ã¦ããã®ã§ããããã以ä¸æ°åã®æ°ãå¤ãããã¨ã¡ã¢ãªã足ããªããªã£ã¦ã¨ã©ã¼ã«ãªã£ã¦ãã¾ãã¾ãããæ®å¿µ
åºåãæ£ãããã¯ãã¾ãã¡ããã¨æ¤è¨¼ãã¦ããªãã®ã§ééã£ã¦ãããæãã¦ãã ãã
ãã¾ã: ã¤ãã§ã«é«åº¦åææ°ãè¨ç®ããã¯ã¨ãªããã ããã®ã§è¼ãã¦ããã¾ã
以ä¸ã®è¨äºã§æ¸ãã¾ãããé«åº¦åææ°ã¯ç´æ°ã®åæ°ãããããå°ããªããããã®æ£ã®æ´æ°ãããå¤ãæ´æ°ã®ãã¨ã§ã
sucrose.hatenablog.com
ã¨ã©ãã¹ããã¹ã®ãµããã«ä¼¼ãæ¹æ³ã§ããã¨\(10^7\)ã¾ã§ã®é«åº¦åææ°ã®åæã3åå¼±ãããã§ã§ãã¾ã
#standardSQL #æ°åãä½ã WITH numbers AS ( SELECT i + 100000 * j AS i FROM UNNEST(GENERATE_ARRAY(0, 99999)) AS i, UNNEST(GENERATE_ARRAY(0, 99)) AS j WHERE i + 100000 * j > 1 ) #ç´æ°ã®æ°ã調ã¹ã , divisible AS ( SELECT i * (j1 + 100000 * j2) AS x, COUNT(*) AS count FROM numbers, UNNEST(GENERATE_ARRAY(0, MOD(CAST(FLOOR(9999999 / i) AS INT64), 100000))) AS j1, UNNEST(GENERATE_ARRAY(0, CAST(FLOOR(CAST(FLOOR(9999999 / i) AS INT64) / 100000) AS INT64))) AS j2 WHERE j1 + j2 > 0 GROUP BY x ) SELECT 1 AS x, 1 AS count UNION ALL SELECT x, count + 1 AS count FROM ( SELECT x, count, MAX(count) OVER less_than_x AS prev_max FROM divisible WINDOW less_than_x AS (ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING and 1 PRECEDING) ) WHERE prev_max IS NULL OR count > prev_max ORDER BY x