Шустрый

Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009
Репутация: 2 Всего: 2
|
Простые числа - это числа, имеющие делителями только 1 и себя. Вот ряд: 2, 3, 5, 7, 11, .... и т.д. Не существует формулы для нахождения простых чисел. Увы ! 1 не является простым числом. Я не использовал решета Эрастофена. Что нового ? Для ускорения я создал каскад: Сначала нахожу все простые числа на отрезке Х от 2 до SQRT(lim) Затем, используя этот результат нахожу все простые числа отрезке Х от SQRT(lim) до lim. Для ускорения я также использовал признаки деления на простые числа: 3, 5, 7, 11.... Код | with limit (lim) as (select int(100000) from sysibm.sysdummy1 ) , numbers (num) as (select 2 from sysibm.sysdummy1 union all select num + 1 from numbers, limit where num + 1 <= int(sqrt(lim))+ 1 ) , prime_check (prime_num, prime_ind) as (select int(2), varchar('P', 1) from sysibm.sysdummy1 union all select 3, 'P' from sysibm.sysdummy1 union all select prime_num + 2, case when int(substr(digits(prime_num + 2), 10, 1)) = 5 and prime_num + 2 > 5 then 'R' when mod( int(substr(digits(prime_num + 2 ), 1, 1)) + int(substr(digits(prime_num + 2 ), 2, 1)) + int(substr(digits(prime_num + 2 ), 3, 1)) + int(substr(digits(prime_num + 2 ), 4, 1)) + int(substr(digits(prime_num + 2 ), 5, 1)) + int(substr(digits(prime_num + 2 ), 6, 1)) + int(substr(digits(prime_num + 2 ), 7, 1)) + int(substr(digits(prime_num + 2 ), 8, 1)) + int(substr(digits(prime_num + 2 ), 9, 1)) + int(substr(digits(prime_num + 2 ), 10, 1)), 3) = 0 and prime_num + 2 > 3 then 'R' when mod( int(substr(digits(prime_num + 2 ), 1, 1)) - int(substr(digits(prime_num + 2 ), 2, 1)) + int(substr(digits(prime_num + 2 ), 3, 1)) - int(substr(digits(prime_num + 2 ), 4, 1)) + int(substr(digits(prime_num + 2 ), 5, 1)) - int(substr(digits(prime_num + 2 ), 6, 1)) + int(substr(digits(prime_num + 2 ), 7, 1)) - int(substr(digits(prime_num + 2 ), 8, 1)) + int(substr(digits(prime_num + 2 ), 9, 1)) - int(substr(digits(prime_num + 2 ), 10, 1)), 11) = 0 and prime_num + 2 > 11 then 'R'
when 1 = (select 1 from sysibm.sysdummy1 where exists (select 1 from numbers where num not in (3, 5, 11) and num <= int(sqrt(prime_num + 2)) + 1 and mod(prime_num + 2, num) = 0 ) ) then 'R' else 'P' end from prime_check, limit where prime_num + 2 <= int(sqrt(lim)) + 1 ) , prime_num_1 (prime_num) as (select prime_num from prime_check where prime_ind = 'P' ) , prime_num_2(prime_num, prime_ind) as (select max(prime_num), varchar('X', 1) from prime_num_1 union all select p2.prime_num + 2, case when int(substr(digits(p2.prime_num + 2), 10, 1)) = 5 then 'R' when mod( int(substr(digits(p2.prime_num + 2 ), 1, 1)) + int(substr(digits(p2.prime_num + 2 ), 2, 1)) + int(substr(digits(p2.prime_num + 2 ), 3, 1)) + int(substr(digits(p2.prime_num + 2 ), 4, 1)) + int(substr(digits(p2.prime_num + 2 ), 5, 1)) + int(substr(digits(p2.prime_num + 2 ), 6, 1)) + int(substr(digits(p2.prime_num + 2 ), 7, 1)) + int(substr(digits(p2.prime_num + 2 ), 8, 1)) + int(substr(digits(p2.prime_num + 2 ), 9, 1)) + int(substr(digits(p2.prime_num + 2 ), 10, 1)), 3) = 0 then 'R' when mod( 6 * int(substr(digits(p2.prime_num + 2 ), 1, 1)) + 2 * int(substr(digits(p2.prime_num + 2 ), 2, 1)) + 3 * int(substr(digits(p2.prime_num + 2 ), 3, 1)) + 1 * int(substr(digits(p2.prime_num + 2 ), 4, 1)) + 5 * int(substr(digits(p2.prime_num + 2 ), 5, 1)) + 4 * int(substr(digits(p2.prime_num + 2 ), 6, 1)) + 6 * int(substr(digits(p2.prime_num + 2 ), 7, 1)) + 2 * int(substr(digits(p2.prime_num + 2 ), 8, 1)) + 3 * int(substr(digits(p2.prime_num + 2 ), 9, 1)) + 1 * int(substr(digits(p2.prime_num + 2 ), 10, 1)), 7) = 0 then 'R' when mod( int(substr(digits(p2.prime_num + 2 ), 1, 1)) - int(substr(digits(p2.prime_num + 2 ), 2, 1)) + int(substr(digits(p2.prime_num + 2 ), 3, 1)) - int(substr(digits(p2.prime_num + 2 ), 4, 1)) + int(substr(digits(p2.prime_num + 2 ), 5, 1)) - int(substr(digits(p2.prime_num + 2 ), 6, 1)) + int(substr(digits(p2.prime_num + 2 ), 7, 1)) - int(substr(digits(p2.prime_num + 2 ), 8, 1)) + int(substr(digits(p2.prime_num + 2 ), 9, 1)) - int(substr(digits(p2.prime_num + 2 ), 10, 1)), 11) = 0 then 'R' when 1 = (select 1 from sysibm.sysdummy1 where exists (select 1 from prime_num_1 p1 where p1.prime_num not in (3, 5, 7, 11) and p1.prime_num <= int(sqrt(p2.prime_num)) + 1 and mod(p2.prime_num + 2, p1.prime_num) = 0 ) ) then 'R' else 'P' end from prime_num_2 p2, limit lm where p2.prime_num + 2 <= lim ) , prime_number (prime_num) as (select * from prime_num_1 union all select prime_num from prime_num_2 where prime_ind = 'P' ) select prime_num "Prime Number" from prime_number
|
Lenny Khiger Это сообщение отредактировал(а) LKhiger - 11.9.2009, 06:38
|