2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1 ... 35, 36, 37, 38, 39  След.
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 14:54 
Аватара пользователя
Значит вот так:

Код:
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ gp2c-run -g hello1.gp
Hello 1 from gp2c again
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ gp2c-run -g hello2.gp
Hello 2 from gp2c again
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ gp2c-run -g hello3.gp
Hello 3 from gp2c again
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 15:05 
Yadryara в сообщении #1717578 писал(а):
Значит вот так:

Ok, значит со скриптом gp2с-run и файлами .gp всё хорошечно.
Давайте полный текст скрипта .sh, как запускаете и что выдаёт.

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 15:15 
Аватара пользователя
run_all_4.sh

Код:
#!/bin/bash

for i in {1..3}; do
    f="hello${i}.gp"
    gp2c-run -g "$f"
done


Код:
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ ./run_all_4.sh
./run_all_4.sh: line 2: $'\r': command not found
./run_all_4.sh: line 3: syntax error near unexpected token `$'do\r''
'/run_all_4.sh: line 3: `for i in {1..3}; do
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 15:23 
Yadryara
Дайте команды находясь в папке с run_all_4.sh
Код:
cat -A run_all_4.sh

Код:
od -c run_all_4.sh

и сюда их выхлоп

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 15:44 
Аватара пользователя
Код:
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ cat -A run_all_4.sh
#!/bin/bash^M$
^M$
for i in {1..3}; do^M$
    f="hello${i}.gp"^M$
    gp2c-run -g "$f"^M$
done^M$
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ od -c run_all_4.sh
0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n  \r  \n   f
0000020   o   r       i       i   n       {   1   .   .   3   }   ;
0000040   d   o  \r  \n                   f   =   "   h   e   l   l   o
0000060   $   {   i   }   .   g   p   "  \r  \n                   g   p
0000100   2   c   -   r   u   n       -   g       "   $   f   "  \r  \n
0000120   d   o   n   e  \r  \n
0000126
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 15:54 
Yadryara
Ok, ясно. :D
Дайте команду
Код:
sed -i 's/\r$//' run_all_4.sh

и можно запускать скрипт
Код:
./run_all_4.sh


Может быть вы, кстати, и скрипт gp2с-run попортили дос-вендовыми <CR>
Установите на всякий случай утилиту dos2unix
Я не помню как там у вас с правами, наверное
Код:
sudo apt install dos2unix

И можно не sed-ом а при помощи неё делать, типа
Код:
dos2unix run_all_4.sh

Я бы наверное на всякий случай и gp2c-run "полечил" от лишних <CR> если они там появились после вашего вмешательства.
Находясь в папке где gp2c-run, команда
Код:
dos2unix gp2c-run

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 16:04 
Аватара пользователя
Ура. Я так понял что эта команда убрала лишние символы, которые как-то появились.

Код:
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ sed -i 's/\r$//' run_all_4.sh
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ ./run_all_4.sh
Hello 1 from gp2c again
Hello 2 from gp2c again
Hello 3 from gp2c again
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ od -c run_all_4.sh
0000000   #   !   /   b   i   n   /   b   a   s   h  \n  \n   f   o   r
0000020       i       i   n       {   1   .   .   3   }   ;       d   o
0000040  \n                   f   =   "   h   e   l   l   o   $   {   i
0000060   }   .   g   p   "  \n                   g   p   2   c   -   r
0000100   u   n       -   g       "   $   f   "  \n   d   o   n   e  \n
0000120

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 16:30 
Yadryara в сообщении #1717592 писал(а):
Я так понял что эта команда убрала лишние символы, которые как-то появились.

Да, эти символы (возврата каретки, ASCII 0x0D) добавил ваш текстовый редактор в windows т.к. в dos/windows так принято. А в юникс (линукс) так не принято, там используется перевод строки без предварительного возврата каретки, и возврат каретки может вызывать проблемы, иногда. Вот вы на такую проблему и натолкнулись.

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 16:53 
Аватара пользователя
Спасибо огромное. Программы уже запустил в 6 потоках. Пока полёт нормальный.

И вот теперь буду спокойно разбираться, в чём же дело, почему переполнение. Во-первых аккуратно объявляю всё что можно как small. А это десятки переменных, не считая векторов.

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 20:58 
Yadryara в сообщении #1717484 писал(а):
Ну то есть вы меня воспитывать взялись? "Пойми, Антоха, ты разобрался плохо"

То, что вы спрашиваете - не о том как писать быстрые программы, а о том как разгрузить вас от ручного запуска медленных программ :D Автоматизация ручных операций не ускоряет работу программ, в этом случае.

 
 
 
 Re: Как писать быстрые программы
Сообщение08.02.2026, 01:15 
Аватара пользователя
С одним словом не согласен.

wrest в сообщении #1717616 писал(а):
разгрузить вас от ручного запуска медленных программ

Разгрузить от ручного запуска быстрых программ.

Потому что компилированный вариант в Убунте работает по-прежнему заметно быстрее. Иначе было бы мало смысла в этом разбираться. Запускал бы в интерпретаторе без проблем.

Кстати, когда начинает много памяти тратиться, то и скорость заметно падает. Хотя и не для всех юнитов.

 
 
 
 Re: Как писать быстрые программы
Сообщение08.02.2026, 21:22 
Аватара пользователя
А дальше вроде разобрался как обходиться одной программой вместо 10, записывая и читая ключевой параметр:

Код:
#!/bin/bash

for i in {1..10}; do
    echo ${i} >        nom5.input
    chmod 666   RabUb_400_5_101.gp
    gp2c-run -g RabUb_400_5_101.gp
done

И в рабочей программе для потока 5 такая строчка:

Код:
nomin=read("nom5.input"):small;

 
 
 
 Re: Как писать быстрые программы
Сообщение09.02.2026, 10:25 
Аватара пользователя
wrest в сообщении #1712117 писал(а):
Потому что small это всё, что меньше 2^64 на 64-разрядных версиях pari.
"Маленькие" числа это такие, которые помещаются в регистр процессора - тогда вычисления с ними максимально быстрые.
В Си- нотации это long (на 64битных системах соответственно 64 бита) или ulongc Там есть некоторая путаница, но для вас безопасно считать что pari-шный small это от -2^63 до 2^63

Ну вот почему-то прокатывает объявление смолом даже таких заведомо гораздо более огромных чисел:

Код:
aa = v[ip+1]:small; m = 6*lcm(v)/aa:small;
n0 = (lift(chinese([chinese([Mod(-j+1, v[j]) | j<-[1..#v]]),
Mod(32-m32+1, 64), Mod(9-m9+1, 27)])) + ip) / aa:small;
print("aa = ", aa, "   m = ", m, "   n0 = ", n0); print;

Порядок у них такой:

Код:
aa = 1352   
m  = 78081320236795167622169713442947824600   
n0 = 52904976929196173102351960114260184299

И считает программа вроде правильно, цепочки находит. Ведь если хоть что-то хоть где-то не разделилось нацело или не тот тип, то обычно страшная ругань 3-хэтажным millerrabin-ом или сегментацией или ещё чем. Нет, нормально работает. C-код не смотрел.

Вполне может быть, что gp2c переобъявляет. Тогда может и не объявлять вообще...

 
 
 
 Re: Как писать быстрые программы
Сообщение09.02.2026, 10:47 
Yadryara в сообщении #1717790 писал(а):
Нет, нормально работает. C-код не смотрел.

Посмотрите :)

-- 09.02.2026, 11:42 --

Yadryara в сообщении #1717790 писал(а):
Тогда может и не объявлять вообще...

Такое впечатление, что вы это (например явные объявления типов переменных) делаете для "очистки совести", а не для того, чтобы что-то реально ускорить.
Тогда не объявляйте, конечно.
В код на .c полезно заглядывать.
Я вот вообще не уверен, что то что вы пишете с вашим бейсик-подходом, транслируется потом в короткие типы в .c Так что да, в код .с загляните. Если увидите там что-то типа static GEN n0;  то ваша попытка объявления n0 как короткого - не удалась :D

 
 
 
 Re: Как писать быстрые программы
Сообщение09.02.2026, 12:04 
Аватара пользователя
wrest в сообщении #1717792 писал(а):
Посмотрите :)

В код на .c полезно заглядывать.

Я вообще хотел учиться по-другом. Писать простенькие программки и заглядывать, заглядывать и писать. А нынче паришный код 9 КБ, а сишный — 59 КБ. И это надо же где-то собрать остатки мужества и заглянуть :-)

wrest в сообщении #1717792 писал(а):
Такое впечатление, что вы это (например явные объявления типов переменных) делаете для "очистки совести", а не для того, чтобы что-то реально ускорить.

Правильное впечатление. Пока именно что для очистки совести.

Вот ещё до такой штуки добрался:

my(n0a=n0*v[ip+1]):int; — работает.

my(n0a=n0*v[ip+1]):small; — не работает. Пишет

Код:
  ***   at top-level: init_RabUb_400_107_0()
  ***                 ^----------------------
  *** init_RabUb_400_107_0: overflow in t_INT-->long assignment.
  ***   Break loop: type 'break' to go back to GP prompt
break>

А так снова работает: n0a=n0*v[ip+1]:small;

Да, там есть static GEN n0;

 
 
 [ Сообщений: 580 ]  На страницу Пред.  1 ... 35, 36, 37, 38, 39  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group