Запрос 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    3165    stopa85    12    

38

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

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

19.10.2023    7556    user1959478    51    

36

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

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3111    maksa2005    8    

26

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

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

1 стартмани

09.06.2023    10905    7    SpaceOfMyHead    18    

61

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

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4361    RustIG    9    

25

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

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

23.11.2022    3531    gzharkoj    14    

25

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

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

1 стартмани

21.03.2022    9042    7    kalyaka    11    

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

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

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