Запрос SQL для нахождения самого большого простого числа меньше заданного

07.11.23

Разработка - Математика и алгоритмы

Данный запрос MS SQL демонстрирует некоторые возможности MS SQL Server по использованию курсора и соединению таблиц, интересный для начинающих программистов.

Наиболее программируемым методом нахождения простых чисел является Решето Эратосфена. Суть его заключается в исключении всех произведений чисел из заданного интервала, все оставшиеся числа - простые. 

Данный запрос содержит несколько интересных на мой взгляд приемов, первый курсор открывается в команде присвоения, что не является очевидным использованием курсора. Это делается для получения таблицы со всеми числами меньше заданного. Во втором запросе получаем все возможные произведения чисел из первой таблицы. Ещё один интересный момент в соединении таблицы, чтобы сократить количество операций умножения и соответственно количество строк второй таблицы( учитывая свойство коммуникативности a*b =b*a),  исключается подобным образом половина произведений.

 

declare @a int
declare @tab table(num int)
declare @tab2 table(num int)

declare @max_simple int
set @max_simple =10000 
 
declare cur cursor for 
select 2
OPEN cur
FETCH NEXT FROM cur INTO @a
WHILE @@Fetch_STATUS=0
BEGIN
	while @a<=@max_simple
	begin
		insert into @tab
		select @a as num
		set @a=@a+1
	end

	FETCH NEXT FROM cur INTO @a
  
END
CLOSE cur
DEALLOCATE cur

insert into @tab2
select t1.num* t2.num as num
from @tab as t1
left join @tab as t2 on t1.num <=t2.num
where t1.num* t2.num<=@max_simple


select max(t3.num)
from @tab as t3
where t3.num not in (select t4.num from @tab2 as t4)

 Кстати, у меня на слабеньком сервере для тестов число 9973 этим запросом нашлось за 1 минуту 50 секунд

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1870    stopa85    12    

34

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4668    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7660    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7936    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4548    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8941    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7961    dusha0020    8    

70
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. nomad_irk 72 16.08.19 16:40 Сейчас в теме
В рамках программирования 1с, можете назвать 3 случая, когда это будет востребовано?
triviumfan; +1
5. alex_bitti 139 16.08.19 17:27 Сейчас в теме
(1) вопрос из разряда Вдудя, почему только 3?
показалось просто полезным для 1С-ников подобные знания, кстати готов поспорить что многие 1С специалисты никогда не писали запросов не на РАВНО в соединении, остальное тоже может быть полезным, у меня к вам встречный вопрос Вы пишете внешние компоненты для 1С на других языках? если нет, то для вас никакого смысла в этом нет
+
7. nomad_irk 72 16.08.19 17:41 Сейчас в теме
(5)я не ставил задачу затроллить вас своим вопросом, но мне реально интересно, что за задача в рамках 1с может потребовать для своего решения нахождение максимального простого числа, меньше заданного. Я еще раз акцентирую внимание, на " в рамках 1с".
Во внешних компонентах - там другой мир, там можно хоть марсоходами управлять....
+
10. alex_bitti 139 16.08.19 17:54 Сейчас в теме
(7) кстати получение массива с датами, очень некрасивое решение с ОБЪЕДИНИТЬ ВЫБРАТЬ 1 КАК Понедельник и проч, 2 это все таки бывают отчеты со штатной расстановкой (может) когда надо сделать соединение не на равно, а нахождение простого числа это импровизация применения возможностей прямого запроса чего нет во встроенном языке, хотя встроенный язык запросов 1С8 мне очень нравится, нельзя сравнивать с тем что было в 7.7
+
11. nomad_irk 72 16.08.19 18:03 Сейчас в теме
(10)в рамках 1с - это единственное решение, если нужно получить именно запросом. Остальные способы получения последовательностей дат - обьектным методом
+
2. acanta 16.08.19 16:46 Сейчас в теме
Случай 1.
https://forum.infostart.ru/forum9/topic8692/
Не подскажете, как в ado обращаться к sql, чтобы из 1с выполнялась вся процедура, а не только select?
+
3. nomad_irk 72 16.08.19 16:58 Сейчас в теме
(2) и каким образом максимальное простое число, меньше заданного коррелирует с декартовым произведением таблиц средствами чисто SQL(т.е. без обработки результата запроса)?
+
4. nomad_irk 72 16.08.19 17:08 Сейчас в теме
(2)отвечаю так, как понял вопрос: для этого необходимо, чтобы процедура находилась в внутри бд sql, ado.command необходимо перевести в режим исполнения процедур/функций, выставив свойство Commandtype в значение 4(точно не помню, можно в нете поглядеть) ну и собсвственно вызвать эту процедуру/функцию по ее имени, передав ннобходимые параметры.
acanta; +1
8. alex_bitti 139 16.08.19 17:48 Сейчас в теме
(4) я так понял что все же нужен результат с неким массивом из дат, в этом случае достаточно просто запроса без вызова процедуры, видимо (2) спрашивает как заменить запрос 1С прямым запросом T-SQL, это сложнее чем просто вызов процедуры
+
9. nomad_irk 72 16.08.19 17:50 Сейчас в теме
(8)тогда никак, Ado так не умеет.
+
6. alex_bitti 139 16.08.19 17:31 Сейчас в теме
(2) думаю стандартными методами никак, можно попробовать изучить вопрос с написанием внешней компоненты, в принципе так эта публикация и появилась. не надо ограничиваться возможностями встроенного языка
+
12. szhukov 139 16.08.19 18:44 Сейчас в теме
(2) "Не подскажете, как в ado обращаться к sql, чтобы из 1с выполнялась вся процедура, а не только select?"
Нужно в начале запроса поставить:
set nocount on
acanta; +1
13. szhukov 139 16.08.19 18:52 Сейчас в теме
Зачем здесь курсор??
В приведенном коде:
"declare cur cursor for
select 2"
курсор выполнится ровно один раз, что эквивалентно одной операции присвоения:
select @a=2
зачем все это, да еще и цикл в цикле?

P.S. С точки зрения оптимизации курсор тяжелая операция, его использование не желательно, если можно обойтись без него.
+
14. Yashazz 4722 16.08.19 20:08 Сейчас в теме
Насчёт таких извратов и их полезности, в своё время Ильдарович приводил примеры практического применения, посмотрите его публикации.

Автор, а хотите "на подумать" - у меня вопрос из интереса, который до сих пор не даёт покоя: можно ли красиво сделать запросом траспонирование квадратной матрицы относительно главной диагонали?
+
15. Поручик 4674 16.08.19 22:35 Сейчас в теме
Интересно для общего развития.
+
16. scientes 288 17.08.19 20:47 Сейчас в теме
17. slawa 26 18.08.19 11:49 Сейчас в теме
При ограничении в 100 тысяч не работает
+
18. triviumfan 93 19.08.19 09:41 Сейчас в теме
Можно было просто забить в гугле: SQL Largest Prime Number
+
Внимание! Тема сдана в архив