|
v7: Код на 7.7 для решения математической задачи | ☑ | ||
---|---|---|---|---|
0
Амулет
26.08.21
✎
21:46
|
Задача: х*х+у*у=19451945
Написать код для 7.7 для нахожддения всех корней. |
|||
1
ololoraise
26.08.21
✎
21:48
|
Ну х=0, y корень из 19451945?
Или наоборот |
|||
2
Базис
naïve
26.08.21
✎
22:05
|
Целочисленные, или вообще?
|
|||
3
Злопчинский
26.08.21
✎
22:05
|
так это ж уравнение окружности.
|
|||
4
Амулет
26.08.21
✎
22:08
|
(3) верно, все точки не нужны, выбрать целочисленные.
|
|||
5
Амулет
26.08.21
✎
22:09
|
(1) это для У=0? Не годится, должно быть два целых числа.
|
|||
6
Злопчинский
26.08.21
✎
22:10
|
целочисленных - 5 пар.
|
|||
7
Амулет
26.08.21
✎
22:10
|
(2) целочисленные.
|
|||
8
Базис
naïve
26.08.21
✎
22:11
|
Вот тебе прототип, поменяй условие в функции. Что-то для онлайн-олимпиады школьник делал.
//******************************************* Процедура Сформировать() Для X = 1 По Лимит Цикл Для Y = 1 По Лимит Цикл Рез = ПосчитатьВариант(X, Y); Если Рез = 0 Тогда Сч = СчЧ + 1; Сообщить(X,Y); КонецЕсли; КонецЦикла; КонецЦикла; Сообщить("Решений " + Сч); КонецПроцедуры |
|||
9
Амулет
26.08.21
✎
22:13
|
(6) Нет.
x=256 y=4403 x=344 y=4397 x=581 y=4372 x=1252 y=4229 x=2363 y=3724 x=2437 y=3676 x=2632 y=3539 x=3088 y=3149 x=3149 y=3088 x=3539 y=2632 x=3676 y=2437 x=3724 y=2363 x=4229 y=1252 x=4372 y=581 x=4397 y=344 x=4403 y=256 |
|||
10
Злопчинский
26.08.21
✎
22:24
|
тады 8. или 16 если зеркальные считать разными.
|
|||
11
Злопчинский
26.08.21
✎
22:27
|
(8) это ж тупым перебором, так неинтересно
|
|||
12
Злопчинский
26.08.21
✎
22:39
|
у мну на компе тупым перебором
1: 256,4403 2: 344,4397 3: 581,4372 4: 1252,4229 5: 2363,3724 6: 2437,3676 7: 2632,3539 8: 3088,3149 9: 3149,3088 10: 3539,2632 11: 3676,2437 12: 3724,2363 13: 4229,1252 14: 4372,581 15: 4397,344 16: 4403,256 Решений 16 за 23.635 . дальше можно оптимизировать, в т.ч. и на контроль достижения зеркальности и далее вычислять не надо, просто взять найденное поменять в парах местами ;-) |
|||
13
Амулет
26.08.21
✎
22:40
|
(11) Перебор сработал быстро.
Процедура Сформировать() Сч=0; Для X = 1 По 4410 Цикл Для Y = 1 По 4410 Цикл Рез = (X*X) + (Y*Y); Если Рез = 19451945 Тогда Сч = Сч + 1; Сообщить(Строка(X)+" и "+Строка(Y)); КонецЕсли; КонецЦикла; КонецЦикла; Сообщить("Решений " + Сч); КонецПроцедуры Получил 256 и 4403 344 и 4397 581 и 4372 1252 и 4229 2363 и 3724 2437 и 3676 2632 и 3539 3088 и 3149 3149 и 3088 3539 и 2632 3676 и 2437 3724 и 2363 4229 и 1252 4372 и 581 4397 и 344 4403 и 256 Решений 16 |
|||
14
Злопчинский
26.08.21
✎
22:51
|
(13) малость соптимизировать, отсекая уже пройденное
|
|||
15
Злопчинский
26.08.21
✎
22:51
|
Время1 = _GetPerformanceCounter();
Лимит = 4411; Сч = 0; //Для X = 1 По Лимит Цикл Состояние(""+X+" из "+Лимит); XX = X*X; Для Y = 1 По Лимит Цикл Рез = XX + Y*Y; Если Рез = 19451945 Тогда Сч = Сч + 1; Сообщить(""+сч+": "+X+","+Y); Прервать; КонецЕсли; КонецЦикла; КонецЦикла; ПредыдущийИгрек = Лимит; Флаг = 1; Для X = 1 По Лимит Цикл XX = X*X; Для Y = -ПредыдущийИгрек По -1 Цикл Если Флаг = 1 Тогда Сообщить("начинаем с "+(-Y)); Флаг = 0; КонецЕсли; Рез = XX + Y*Y; Если Рез = 19451945 Тогда ПредыдущийИгрек = -Y; ПредыдущийИгрек = ПредыдущийИгрек-1; сч = сч + 1; Сообщить(""+сч+": "+X+","+(-Y)); Флаг = 1; Прервать; КонецЕсли; КонецЦикла; КонецЦикла; |
|||
16
Злопчинский
26.08.21
✎
22:53
|
начинаем с 4411
1: 256,4403 начинаем с 4402 2: 344,4397 начинаем с 4396 3: 581,4372 начинаем с 4371 4: 1252,4229 начинаем с 4228 5: 2363,3724 начинаем с 3723 6: 2437,3676 начинаем с 3675 7: 2632,3539 начинаем с 3538 8: 3088,3149 начинаем с 3148 9: 3149,3088 начинаем с 3087 10: 3539,2632 начинаем с 2631 11: 3676,2437 начинаем с 2436 12: 3724,2363 начинаем с 2362 13: 4229,1252 начинаем с 1251 14: 4372,581 начинаем с 580 15: 4397,344 начинаем с 343 16: 4403,256 начинаем с 255 Решений 16 за 56.063 - если в одну строку то будет секунд 19 |
|||
17
Злопчинский
26.08.21
✎
22:54
|
можно еще больше соптимизировать по колву вычисляемых значений в циклах
|
|||
18
RomanYS
26.08.21
✎
22:58
|
Вы что издеваетесь? В клюшках корней нет? Одного цикла достаточно
|
|||
19
Злопчинский
26.08.21
✎
23:00
|
(18) не нема, ни sqr, ни sqrt
|
|||
20
RomanYS
26.08.21
✎
23:01
|
(19) и pow нет?
|
|||
21
RomanYS
26.08.21
✎
23:01
|
Exp?
|
|||
22
Злопчинский
26.08.21
✎
23:01
|
(20) губу на лоб пришпили ;-)
|
|||
23
Злопчинский
26.08.21
✎
23:02
|
(21) ...и пришей ;-)
|
|||
24
Злопчинский
26.08.21
✎
23:06
|
циклы шагать надо не по 1, а с вычисляемым шагом
|
|||
25
Злопчинский
26.08.21
✎
23:13
|
в (15) 16'017'767 итераций, сэкономлено почти 3.5млн итераций тупого перебора ;-)
|
|||
26
RomanYS
26.08.21
✎
23:22
|
(23) вот же извращенцы, логарифмы аж 3 штуки положили, а прямой операции не одной))
(25) да не нужно вложенных циклов. Все квадраты загнать в коллекцию, а потом в цикле поиск. Или поиск там тоже тупым перебором? |
|||
27
Злопчинский
26.08.21
✎
23:28
|
(26) Поиск чего?
|
|||
28
RomanYS
26.08.21
✎
23:31
|
(27) разницы в списке квадратов
|
|||
29
Bigbro
27.08.21
✎
04:43
|
зачем все обсчитывают четверть круга, если из соображений симметрии очевидно что надо считать осьмушку? дальше все зеркалится.
|
|||
30
Злопчинский
27.08.21
✎
09:50
|
(29) опоздун, ранее об этом замечали уже
|
|||
31
rphosts
27.08.21
✎
09:53
|
(8) 1 цикл + функция SQRT
|
|||
32
Ёпрст
27.08.21
✎
10:28
|
(19) всё там есть. И штатно, и через класс Math
|
|||
33
Ёпрст
27.08.21
✎
10:30
|
||||
34
Ёпрст
27.08.21
✎
10:30
|
||||
35
Garykom
гуру
27.08.21
✎
10:32
|
слабо запросом?
|
|||
36
Злопчинский
27.08.21
✎
11:13
|
(32) штатно?
|
|||
37
serpentt
27.08.21
✎
11:25
|
(36) смотри (33)
|
|||
38
Злопчинский
27.08.21
✎
12:09
|
(37) это понятно, встроенных по языку нет
|
|||
39
Djelf
27.08.21
✎
12:22
|
(35) Можно и запросом. На 1sqlite те же 16 вариантов - 2.8c
|
|||
40
andrewalexk
27.08.21
✎
12:46
|
(18) :)
слабо написать? sc=createObject("msScriptControl.scriptControl"); sc.language="VBscript"; |
|||
41
Mikeware
27.08.21
✎
13:36
|
(40) а если под вайном?
|
|||
42
Mikeware
27.08.21
✎
13:37
|
(15) что у меня нифига не секунды считает...
|
|||
43
Mikeware
27.08.21
✎
13:50
|
тупо алгоритмом Брезенхема, с проверкой при изменении координат
тестил на снеговике, клюшек под рукой нет &НаКлиенте Процедура Команда1(Команда) R = 4410; //19451945; X1=0; Y1=0; x = 0; y = R; Начало=ТекущаяДата(); delta = (1 - 2 * R); error = 0; счРешений=0; пока (y >= 0) Цикл Если x>y Тогда // считаем осьмушку Прервать; КонецЕсли; error = (2 * (delta + y) - 1); Если ((delta < 0) И (error <= 0)) Тогда Если x*x+y*y=19451945 Тогда счРешений = счРешений + 1; Сообщить("Решение №"+счРешений+" х="+(x)+ " y="+(y)); КонецЕсли; x = x + 1; delta = delta + (2 * x + 1); Продолжить; КонецЕсли; error = 2 * (delta - x) - 1; Если ((delta > 0) И (error > 0)) Тогда Если x*x+y*y=19451945 Тогда счРешений = счРешений + 1; Сообщить("Решение №"+счРешений+" х="+(x)+ " y="+(y)); КонецЕсли; Y = Y - 1; delta = delta + 1 - 2 * y; Продолжить; КонецЕсли; Если x*x+y*y=19451945 Тогда счРешений = счРешений + 1; Сообщить("Решение №"+счРешений+" х="+(x)+ " y="+(y)); КонецЕсли; x = x + 1; delta = delta + 2 * (x - y); y = y - 1; КонецЦикла; конец = ТекущаяДата(); Сообщить("решений:"+счРешений); Сообщить("время="+(ТекущаяДата()-Начало)); //возврат; // Злоп Начало=ТекущаяДата(); Лимит = 4411; Сч = 0; //Для X = 1 По Лимит Цикл Состояние(""+X+" из "+Лимит); XX = X*X; Для Y = 1 По Лимит Цикл Рез = XX + Y*Y; Если Рез = 19451945 Тогда Сч = Сч + 1; Сообщить(""+сч+": "+X+","+Y); Прервать; КонецЕсли; КонецЦикла; КонецЦикла; ПредыдущийИгрек = Лимит; Флаг = 1; счРешений=0; Для X = 1 По Лимит Цикл XX = X*X; Для Y = -ПредыдущийИгрек По -1 Цикл Если Флаг = 1 Тогда Сообщить("начинаем с "+(-Y)); Флаг = 0; КонецЕсли; Рез = XX + Y*Y; Если Рез = 19451945 Тогда ПредыдущийИгрек = -Y; ПредыдущийИгрек = ПредыдущийИгрек-1; счРешений = счРешений + 1; Сообщить("Решение №"+счРешений+" х="+(X)+ " y="+(-Y)); Флаг = 1; Прервать; КонецЕсли; КонецЦикла; КонецЦикла; Сообщить("решений:"+счРешений); Сообщить("время="+(ТекущаяДата()-Начало)); КонецПроцедуры |
|||
44
Mikeware
27.08.21
✎
13:51
|
Брезенхем - 1 секунда, код злопа - 930
Решение №1 х=256 y=4 403 Решение №2 х=344 y=4 397 Решение №3 х=581 y=4 372 Решение №4 х=1 252 y=4 229 Решение №5 х=2 363 y=3 724 Решение №6 х=2 437 y=3 676 Решение №7 х=2 632 y=3 539 Решение №8 х=3 088 y=3 149 решений:8 время=0 начинаем с 4 411 Решение №1 х=256 y=4 403 начинаем с 4 402 Решение №2 х=344 y=4 397 начинаем с 4 396 Решение №3 х=581 y=4 372 начинаем с 4 371 Решение №4 х=1 252 y=4 229 начинаем с 4 228 Решение №5 х=2 363 y=3 724 начинаем с 3 723 Решение №6 х=2 437 y=3 676 начинаем с 3 675 Решение №7 х=2 632 y=3 539 начинаем с 3 538 Решение №8 х=3 088 y=3 149 начинаем с 3 148 Решение №9 х=3 149 y=3 088 начинаем с 3 087 Решение №10 х=3 539 y=2 632 начинаем с 2 631 Решение №11 х=3 676 y=2 437 начинаем с 2 436 Решение №12 х=3 724 y=2 363 начинаем с 2 362 Решение №13 х=4 229 y=1 252 начинаем с 1 251 Решение №14 х=4 372 y=581 начинаем с 580 Решение №15 х=4 397 y=344 начинаем с 343 Решение №16 х=4 403 y=256 начинаем с 255 решений:16 время=930 |
|||
45
Злопчинский
27.08.21
✎
14:55
|
(44) ты злопа в чем меряешь?
У меня он 53 секунды гдето |
|||
46
Mikeware
27.08.21
✎
15:03
|
(45) в секундах, конечно. в попугаях ты длиннее...
единственное, что твой код считает четверть, мой - осьмушку. Ну, получится одна секунда против 465... клюшек нет под рукой, гонял на снеговике на клиенте. прогони, по возможности, мой код на клюшках, плз. |
|||
47
Злопчинский
27.08.21
✎
15:06
|
(46) вечером прогоню
И что у тебя за комп? Целерон что ли, отчего злоп так долго считает? У меня ноут что-то типа и5-6670hq |
|||
48
Mikeware
27.08.21
✎
15:06
|
(46) хотя вру, для осьмушки он не вдвое сократится, а меньше - у тебя ж сокращается второй цикл... запустил на осьмушку, сейчас посчитает, скажу.
но меня как-то разница между твоими 53 секунды, и моими 930 напрягает |
|||
49
Mikeware
27.08.21
✎
15:07
|
не, я на сервере РДПшном, в форме на клиенте
|
|||
50
Mikeware
27.08.21
✎
15:08
|
+(49) досчитает, сделаю НаСервере, проверю. но как-то странно
|
|||
51
Mikeware
27.08.21
✎
15:12
|
(47) 733 секунды получилось
|
|||
52
Злопчинский
27.08.21
✎
15:16
|
(51) что то не так в твоем королевстве, ща переползу на свой комп
|
|||
53
Djelf
27.08.21
✎
15:17
|
(46) Ух ты, алгоритм Брезенхема это очень быстро!
91 ms Брезенхем, 63240 ms Злоп, 2867 ms 1sqlite На sqlite такое видимо не сотворить, хранимок то нет...
|
|||
54
Mikeware
27.08.21
✎
15:23
|
(53) только вот какого хрена у меня метод злопа медленно так считает?
|
|||
55
Mikeware
27.08.21
✎
15:24
|
ха! На сервере - метод злопа 343
|
|||
56
Garykom
гуру
27.08.21
✎
15:26
|
"алгоритм Брезенхема для рисования окружностей" это гениально конечно
вместо полного перебора рисуем (получаем массив пар x,y) точки осьмушки окружности затем прогоняем их на равенство ну и последним шагом зеркалируем |
|||
57
Garykom
гуру
27.08.21
✎
15:27
|
Задачку (0) можно смело на олимпиаду по информатике
|
|||
58
Mikeware
27.08.21
✎
15:30
|
(53) брезенхем - O(n), у злопа что-то типа O(n)O(log n). твой я что-то не оценю, на план смотреть надо.
(56) чую я, что есть подводные камни у брезенхема... |
|||
59
Злопчинский
27.08.21
✎
15:31
|
(54) восьмерочники должны страдать.
представляю как у тебя снеговик скрипит |
|||
60
Mikeware
27.08.21
✎
15:33
|
(59) на сервере - на порядок быстрее
|
|||
61
Garykom
гуру
27.08.21
✎
15:35
|
(58) >чую я, что есть подводные камни у брезенхема...
теоретически оно дает наиболее близкие целые точки к окружности лишние могут быть и много! пропустить ничего не должно |
|||
62
Mikeware
27.08.21
✎
15:37
|
(61) лишние мы отсекаем проверкой. а вот насчет пропусков - опасаюсь я там, где малое изменение..
эх, не хватает математических знаний... |
|||
63
Garykom
гуру
27.08.21
✎
15:37
|
(61)+ хмм да есть подвох
может пропустить точки |
|||
64
Garykom
гуру
27.08.21
✎
15:37
|
(62) да сча прикинул и может запросто пропустить
надо +- соседние точки проверять еще |
|||
65
Mikeware
27.08.21
✎
15:39
|
(63) хотя как раз на первой части в данном случае пропусков не будет, будут в конце, если четверть считать.
|
|||
66
Mikeware
27.08.21
✎
15:40
|
злоп, ну что там? галактеко волнуеццо!
|
|||
67
Garykom
гуру
27.08.21
✎
15:42
|
(65) везде может пропускать и в начале тоже, точнее зависит какая четверть и откуда-куда рисуем
в середине менее вероятно, с одного края более чем с другого алгоритм шахматкой идет и по диагонали может не нарисовать |
|||
68
Mikeware
27.08.21
✎
15:44
|
(67) лениво уже в пятницу вечером думать...
|
|||
69
RomanYS
27.08.21
✎
15:52
|
(57) По математике. У нее кажется есть красивое решение, вроде у Савватеева мелькало.
По информатике на какую олимпиаду, задача в лоб решается. |
|||
70
Злопчинский
27.08.21
✎
15:52
|
(58)
МАКИВАРА: Решение №1 х=256 y=4403 Решение №2 х=344 y=4397 Решение №3 х=581 y=4372 Решение №4 х=1252 y=4229 Решение №5 х=2363 y=3724 Решение №6 х=2437 y=3676 Решение №7 х=2632 y=3539 Решение №8 х=3088 y=3149 Решений 8 за 0.063 сек, за 3'121 итераций ЗЛОП (костылем искусственно отсек осьмушку) начинаем с 4410 1: 256,4403 начинаем с 4402 2: 344,4397 начинаем с 4396 3: 581,4372 начинаем с 4371 4: 1252,4229 начинаем с 4228 5: 2363,3724 начинаем с 3723 6: 2437,3676 начинаем с 3675 7: 2632,3539 начинаем с 3538 8: 3088,3149 Решений 8 за 42.702 сек, за 12'762'411 итераций |
|||
71
Злопчинский
27.08.21
✎
15:53
|
(66) комп у тебя гавно, вот что ;-)
|
|||
72
Mikeware
27.08.21
✎
15:56
|
(70) ну, значит порядок цЫфер верный. Это радует
(71) видимо, тонкости работы клиента/сервера. Может, и комп говно. |
|||
73
Garykom
гуру
27.08.21
✎
16:03
|
(69) эээ нет даже полный перебор можно сократить правильно
можно взять четверть вместо круга можно восьмую часть а можно взять прямоугольник дуги восьмой части и без Брезенхема обойтись |
|||
74
RomanYS
27.08.21
✎
16:11
|
(73) При наличии корней - задача банальная. При отсутствии - проще реализовать их расчет (хотя бы итерационно).
|
|||
75
Garykom
гуру
27.08.21
✎
16:16
|
(74) банальная не значит оптимальное решение
|
|||
76
Garykom
гуру
27.08.21
✎
16:17
|
(75)+ если вместо миллионов радиус сделать побольше то перебором будет договато
|
|||
77
Злопчинский
27.08.21
✎
16:18
|
(72) какой клиент-сервер на клюшках? 430 вместо 43 - на порядок отличие
|
|||
78
RomanYS
27.08.21
✎
16:34
|
(75) оптимальное решение на поверхности и сложность его O(sqrt(N)).
Весь сыр-бор в теме только от отсутствия корней в клюшках. |
|||
79
Garykom
гуру
27.08.21
✎
16:41
|
(78) вычисление квадратного корня это не оптимальная штука
|
|||
80
Garykom
гуру
27.08.21
✎
16:42
|
(79)+ Книга знаний: Математические вычисления в 1С
во всех ЯП оно достаточно накладно считается |
|||
81
Mikeware
27.08.21
✎
16:52
|
(78) если есть решение с таким O(), то корень можно и методом ньютона сделать. Показывай.
|
|||
82
Garykom
гуру
27.08.21
✎
17:01
|
(81) дык вероятно y через x выразить и пробежаться по x, вычисляя y и проверяя на целое
|
|||
83
Garykom
гуру
27.08.21
✎
17:02
|
(82)+ только внутри O() будет не совсем оно ибо для вычисления корня нужны циклы
|
|||
84
RomanYS
27.08.21
✎
17:29
|
(81) Реально издеваетесь)))?
N = 19451945; Для X = 1 По Цел(Sqrt(N)) Цикл Y = Цел(Sqrt(N-X*X)); Если X*X + Y*Y = N Тогда Сообщить(""+X+" "+Y); КонецЕсли; КонецЦикла; |
|||
85
Garykom
гуру
27.08.21
✎
17:48
|
(84) >Y = Цел(Sqrt(N-X*X));
вот тут у тебя скрытый цикл, пусть и небольшой |
|||
86
RomanYS
27.08.21
✎
18:11
|
(85) Только общую сложность он не сильно меняет. Пусть будет O(Sqrt(N)*Log(N))
|
|||
87
Mikeware
27.08.21
✎
19:43
|
(86) O(n) получается. Как у брезенхема.
|
|||
88
RomanYS
27.08.21
✎
19:49
|
(87) с чего вдруг?
|
|||
89
Вафель
27.08.21
✎
21:02
|
(84) можно только нечетные перебирать
|
|||
90
Вафель
27.08.21
✎
21:04
|
А разве корень не вычисляется соответствующей командой ассемблера?
|
|||
91
Ненавижу 1С
гуру
27.08.21
✎
21:30
|
Если считать что факторизация правой части известна
5 * 73 * 137 * 389 То каждое из чисел можно представить образом в виде суммы квадратов Далее комбинировать решения, используя, что если a=x^2+y^2 и b=z^2+t^2 тогда a*b=(xz+yt)^2+(xt-yz)^2=(xz-yt)^2+(xt+yz)^2 То есть каждый множитель даёт два варианта Отсюда решений 2^4=16 если считая только положительные |
|||
92
Злопчинский
27.08.21
✎
22:32
|
(90) сомневаюсь
|
|||
93
Вафель
27.08.21
✎
22:37
|
(92) есть конечно же
https://www.club155.ru/x86cmdfpu/FSQRT |
|||
94
RomanYS
27.08.21
✎
22:41
|
(91) а вот и красота подъехала) А доказать что других решений нет?
|
|||
95
RomanYS
27.08.21
✎
22:46
|
(92) у современных процов уже сотни инструкций. Даже если корня нет, то лог и экспонента должны быть
|
|||
96
Ненавижу 1С
гуру
27.08.21
✎
23:05
|
(94) чето я уже слаб в этом
Можно почитать тут https://ru.m.wikipedia.org/wiki/Гауссовы_целые_числа#Подсчёт_числа_представлений_в_виде_суммы_двух_квадратов |
|||
97
Djelf
28.08.21
✎
08:00
|
(84) С применением объекта Match из 1C++ не плохо - 140 мс, но медленнее Брезенхема - 91 ms
Но в sqlite с начиная с версии 2021-03-12 (3.35.0) наконец завезли математические функции и материализованные представления. Собрал с ними, получается 5 ms.
|
|||
98
andrewalexk
28.08.21
✎
08:04
|
(41) :) тогда все вопросы к линусу
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |