2014 dxdy logo

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

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





Начать новую тему Ответить на тему На страницу Пред.  1 ... 10, 11, 12, 13, 14  След.

А вам пакет PARI/GP интересен?
Да 84%  84%  [ 36 ]
Нет 5%  5%  [ 2 ]
Не уверен(а) 12%  12%  [ 5 ]
Всего голосов : 43
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение24.02.2017, 22:32 


13/02/17
257
Varanasi
Код:
for(n=2,100, if(vecmax(factor(n)[ ,2])!=1, print(n,":",0), if((matsize(factor(n))[1])%2==0, print(n,":",-1), print(n,":",1))))


Ну вот, ещё один вариант функции moebius, с использованием Ваших рекомендаций, Dmitriy40, только почему-то работает лишь для n>1.

-- 24.02.2017, 23:36 --

Подскажите пожалуйста ещё, как лучше структуризовать текст и вообще, нужно ли это делать при написании кода, а также я что-то где-то слышал про фигурные скобки, но не понял в каких случаях их необходимо расставлять?

Также не услышал, можно ли копировать как-то куски кода из консоли в буфер и вставлять их? И что делать если количество результатов более 300, печатать их в текстовый файл для просмотра или можно как-то увеличить прокрутку?

И кстати, как запросить ввод числа в процессе исполнения программы?
Можно ли написанный код как-то сохранять? Создать библиотеку собственных функций?

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение24.02.2017, 23:10 


20/08/14
2521
Россия, Москва
Aether
Для единицы нет разложения на простые сомножители, factor(1) выдаёт пустую матрицу, потому и не работает. Ну так ведь и не должно.
Я бы не вызывал дважды factor(n), а сохранил его в матрицу и потом обращался к ней (на работу не влияет).

Фигурные скобки позволяют не записывать всю программу в одну строку, а разбить на несколько. На выполнение все строки запустятся лишь когда закроется фигурная скобка. Может и ещё где применяются.

Как именно оформлять код - да по обычным правилам. Ну там пробелы, отступы для вложенных конструкций, комментарии. Всё как и везде в языках высокого уровня. Конкретно PARI/GP вроде бы никаких особых требований или ограничений не накладывает.

Копирование и вставка в/из буфера делаются средствами ОС (через системное меню окна). Размер окна консоли регулируется также системой (в свойствах окна). К PARI/GP не относится.

Сохранение в файл можно вместо записи в лог попробовать делать командами write/write1 - но ни разу не пробовал. В начале этой темы говорилось что лучше и проще пользоваться логгированием вывода на экран.

Запросить число (или вектор или ещё чего) из входного потока (клавиатуры) можно так: x=input(). Из файла прочитать данные можно функциями read* (их несколько).

Сохранить код кроме как в логе не знаю как, но можно в любой момент запустить выполнение программы из внешнего файла командой \r файл (есть в справке по команде ?\). Можно запустить и сразу при старте указав имя файла в коммандной строке. Т.е. можно пользоваться любым редактором текста для написания программ и запускать их на исполнение в PARI/GP. Дальше думаю всё понятно.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.02.2017, 00:14 


20/08/14
2521
Россия, Москва
Aether
Для проверки наличия лишь первых степеней в разложении есть специальная функция issquarefree(n).

PS. Вообще много информации можно подчерпнуть даже из 4-х страничной GP Reference Card с родного сайта. Не говоря уж о полной доке.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.02.2017, 00:27 


13/02/17
257
Varanasi

(Оффтоп)

Dmitriy40 в сообщении #1195199 писал(а):
Вообще много информации можно подчерпнуть даже из 4-х страничной GP Reference Card с родного сайта
. Не говоря уж о полной доке.



С моим корявым английским, который я не учил ни в школе, ни в ВУЗе это представляет определенные трудности, приходится постоянно домысливать, набирать перевод в гугле, который переводит математический текст не особо лучше меня. Вот если бы была такая дока на русском, хотя бы refcard, было бы конечно существенно проще.


Еще раз спасибо за помощь.

-- 25.02.2017, 01:34 --

Dmitriy40 в сообщении #1195199 писал(а):
Для проверки наличия лишь первых степеней в разложении есть специальная функция issquarefree(n).


Даже не жалею, что не узнал об этом раньше. Хотя рад, что узнал теперь, после того как реализовал програму без неё.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение26.02.2017, 21:41 


13/02/17
257
Varanasi
Столкнулся с вопросом, можно ли как-то просуммировать строку или столбец матрицы если она(матрица) не задана явно, например является результатом факторизации числа? Или придется сначала определять размер матрицы, чтобы организовать цикл суммирования?

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение26.02.2017, 23:11 


20/08/14
2521
Россия, Москва
Aether
А чем не подходит выражение типа s=vecsum(factor(x)[,1]) или m=factor(x); s=vecsum(m[,1])? Вот когда понадобится что-то сложнее суммирования или произведения, вот тогда придётся писать свой цикл.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение26.02.2017, 23:59 


13/02/17
257
Varanasi
Dmitriy40, очень даже подходит, спасибо, всё получилось.

Код:
for(n=1,100, if(issquarefree(n)==0, if(vecsum(factor(n)[,2]%2==0, print(n,":",-1), print(n,":",1)),  print(n,":",0)))


Эта программка числам натурального ряда, факторизация которых свободна от квадратов и высших степеней, присваивает 0. Числам же, факторизация которых содержит высшие степени, присваивает -1 или +1 в зависимости от того, четна или нечетна сумма показателей степени в факторизации числа. Т.е. это своеобразный аналог функции Мёбиуса, только -1 и 1 определены в той области где у функции Мёбиуса определен 0, а 0 определен в той области, где у функции Мёбиуса определены -1 и 1.

Всё с PARI/GP хорошо, только нет возможности узнавать о функциях, т.к. их описание на английском. Надеюсь найдутся добровольцы, которые смогут грамотно перевести хотябы 4 странички refcard, думаю тогда существенно больше людей смогли бы оценить полезность этого калькулятора. И еще один недостаток - постоянно путаюсь со скобками, необходим какой-то алгоритм, чтобы их считать и расставлять правильно, но может это приходит с опытом. В общем оба недостатка языка заключаются во мне )

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение27.02.2017, 00:27 
Аватара пользователя


11/06/12
7149
Минск
Aether в сообщении #1195674 писал(а):
постоянно путаюсь со скобками, необходим какой-то алгоритм, чтобы их считать и расставлять правильно, но может это приходит с опытом.
Приходит. А пока не пришло, можно записывать программы не навалом в одну строку, а с переносом строк, визуально выделяя подуровни (если в PARI/GP так можно; я, простите, ни в зуб ногой). И ещё маленький секрет: поставили открывающую скобку — немедленно ставьте закрывающую.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение27.02.2017, 00:39 


13/02/17
257
Varanasi
Aritaborian в сообщении #1195680 писал(а):
И ещё маленький секрет: поставили открывающую скобку — немедленно ставьте закрывающую.


Спасибо за совет, попробую.

-- 27.02.2017, 01:50 --

(Оффтоп)

Кстати, поиграл с функцией Мертенса для этой самой функции анти Мёбиуса на интервале до 100000, похоже для неё существует аналогичное гипотезе Римана соотношение: $M`(n)=O(n^{0,5+\varepsilon})$. Без этого калькулятора о таких наблюдениях не могло бы быть и речи, а так- всё заняло полторы строки кода и несколько минут времени.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение27.02.2017, 01:02 


20/08/14
2521
Россия, Москва
Aether
Снова повторю, не нужно результат логических выражений проверять на ноль или единицу. Вместо единицы писать просто функцию, вместо нуля или переставить операторы в ветвях then и else местами - вместо if(a()==0,b,c) писать if(a(),c,b) или if(a(),,b) если "с" не нужно - или взять отрицание функции операцией ! - т.е. условие if(!issquarefree(),...).
Кроме того, наверняка выгоднее выполнить один раз факторизацию, а потом уж работать с матрицей делителей, чем выполнять факторизацию дважды, в issquarefree и в factor.

Aritaborian в сообщении #1195680 писал(а):
можно записывать программы не навалом в одну строку, а с переносом строк, визуально выделяя подуровни (если в PARI/GP так можно; я, простите, ни в зуб ногой).
Можно, обрамить весь текст скобками {} и всё.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение27.02.2017, 01:21 


13/02/17
257
Varanasi
Dmitriy40, ещё раз спасибо за Ваши правильные замечания.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение28.02.2017, 17:16 
Модератор
Аватара пользователя


11/01/06
5156
Aether в сообщении #1195674 писал(а):
Код:
for(n=1,100, if(issquarefree(n)==0, if(vecsum(factor(n)[,2]%2==0, print(n,":",-1), print(n,":",1)),  print(n,":",0)))

Функция vecsum(factor(n)[,2]) имеет своё собственное имя: bigomega(n).
Ну а минус-плюс единицу в зависимости от чётности можно получить как (-1)^(bigomega(n)+1).

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение28.02.2017, 17:49 


20/08/14
2521
Россия, Москва

(Оффтоп)

maxal в сообщении #1196042 писал(а):
Функция vecsum(factor(n)[,2]) имеет своё собственное имя: bigomega(n).
Aether, вот поэтому я и не возмусь за перевод даже refcard - уровня мат.подготовки не хватит.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение28.02.2017, 18:04 


16/08/05
684
У меня с функцией valuation такой казус приключился. Я рискнул добавить последовательность производную от простых экспонет Вагстафа A000978.

Описание было такое:
"a(n) is the positive integer x such that 3^((W-1)/(2*p)) == +-2^x (mod W), where p > 3 is prime, W=(2^p+1)/3 is the n-th Wagstaff prime and x < p."

Её одобрили и опубликовали. Но через несколько дней я нашёл в ней ошибку, расстроился и попросил админов удалить последовательность, они удалили.

Последовательность была такая:
Код:
3, 4, 1, 5, 15, 11, 11, 4, 36, 57, 44, 66, 5, 103, 150, 145, 287, 267, 329, 476, 2363, 2915, 156, 3641, 8305, 2689, 10266, 7662


Ошибка была в третьем члене, должно быть 0 вместо 1. На этом члене степень двойки вырождается в единицу.

Сейчас ничего лучше такого исправленного кода придумать не могу
Код:
wgs()=
{
A000978=[3, 5, 7, 11, 13, 17, 19, 23, 31, 43, 61, 79, 101, 127, 167, 191, 199, 313, 347, 701, 1709, 2617, 3539, 5807, 10501, 10691, 11279, 12391, 14479, 42737, 83339, 95369, 117239, 127031, 138937, 141079, 267017, 269987, 374321, 986191, 4031399];

for(n=2, #A000978,
p= A000978[n];
W=(2^p+1)/3;
s= (W-1)/2/p;
T= Mod(3, W)^s;
if(T==1,
  print1(0, ", ")
,
  x= valuation(lift(T), 2);
  if(x, print1(x, ", "), x= valuation(lift(-T), 2); print1(x, ", "))
)
)
};


Возможно ли проще сделать код? И добавляют ли такие последовательности с одним диссонирующим членом?

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение01.03.2017, 00:24 


13/02/17
257
Varanasi
maxal в сообщении #1196042 писал(а):
Функция vecsum(factor(n)[,2]) имеет своё собственное имя: bigomega(n).


Уважаемый maxal, спасибо за Ваши ценные замечания, но хотелось бы заметить, что PARI/GP не будет доступен для русскоговорящей аудитории во всей своей полноте, пока не появится качественный перевод хотябы refcard. Вы даёте разрозненное описание функций в многостраничной теме и, чтобы найти необходимую, придется перелопатить всю тему. Думаю такая перспектива мало кого из новичков, плохо владеющих английским, вдохновит на изучение PARI/GP.

Не сочтите за наглость, но Вы представляетесь самым подходящим, даже идеальным кандидатом на перевод четырех страничек очень мелкого шрифта refcard, а возможно и более масштабного труда- например написания первого и единственного русскоязычного учебника по PARI/GP )

-- 01.03.2017, 01:34 --

Dmitriy40 в сообщении #1196055 писал(а):
maxal в сообщении #1196042 писал(а):
Функция vecsum(factor(n)[,2]) имеет своё собственное имя: bigomega(n).
Aether, вот поэтому я и не возмусь за перевод даже refcard - уровня мат.подготовки не хватит.


Это при том, что Вы очень даже неплохо владеете программированием на этом языке и по всей видимости владеете английским, что уж тогда говорить о таких как я, которые столкнулись с ним впервые и в английском почти ни бум бум.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 198 ]  На страницу Пред.  1 ... 10, 11, 12, 13, 14  След.

Модераторы: Toucan, maxal, Karan, PAV, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group