2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Перманент матрицы
Сообщение05.07.2023, 15:23 
Заслуженный участник


12/08/10
1680
kthxbye в сообщении #1599980 писал(а):
ТС использует необъявленный x который неизвестно что.
Разве это не свободная переменная?
Цитата:
2.3.10 Polynomials (t_POL). Type the polynomial in a natural way, not forgetting to put a “∗”
between a coefficient and a formal variable;
? 1 + 2*x + 3*x^2
%1 = 3*x^2 + 2*x + 1
This assumes that x is still a ”free variable”.

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 15:33 


05/09/16
12108
Null в сообщении #1599981 писал(а):
Разве это не свободная переменная?

Свободная, пока вы ей не присвоите что-нибудь (об этом и говорит "This assumes that x is still a ”free variable”."). Соответственно, ваша программа должна за этим следить.
Например, "освободить" через kill(x) или x='x

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 17:13 
Модератор
Аватара пользователя


11/01/06
5710
wrest в сообщении #1599966 писал(а):
Допустим у нас в векторе есть коэффициенты полинома $3x^2+2x+10$ и мы хотим вычислить его значение при $x=3$, равное $43$. Это можно сделать так:
? v=[3,2,10];x=3;eval(Pol(v,'x))
%1 = 43
?

eval лучше не использовать для вычисления значений многочленов (оно не использует схему Горнера). Подставлять значения $x$ в $f(x)$ можно так: subst(f,x,3) или если нет уверенности в имени переменной, то subst(f,variable(f),3).

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 17:35 
Аватара пользователя


22/11/13
02/04/25
549
maxal, спасибо за информацию!

Тогда вот это наверное лучший алгоритм на PARI/GP, работающий по методу участника Null:
Код:
b(n)=my(v1, v2); v1=vector(n+1,i,i--; i!*x^i); v2=v1; for(i=1,n,for(j=i,n,v2[j+1]=my(A=intformal((j-i)^2*v2[j])); v2[j+1]=A+subst(v1[j+1],x,i)-subst(A,x,i)); v1=v2); v1

На моем ноуте он считает $400$ членов за $43$ секунды. Примерно за это же время мой алгоритм вычисляет $500$ членов.

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 17:38 
Модератор
Аватара пользователя


11/01/06
5710
Вот мой код на PARI/GP. На моем компе вычисляет 500 членов за 8 секунд.
Код:
{ a204262terms(N) = my(a,f,g,x='x);
  a = vector(N);
  a[1] = 1;
  f = [x,1];
  for(n=2,N,
    g = List([n!*x^n]);
    for(l=1,n-1,
        listput(g, intformal((n-l)^2*f[l+1],x));
        g[#g] += subst(g[#g-1]-g[#g],x,l);
    );
    listput(g, a[n] = subst(g[#g],x,n) );
    f = g;
  );
  a;
}

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 18:20 
Заслуженный участник


12/08/10
1680
Сложность в любом случае $O(n^3\times(n))$(на длинную арифметику).
kthxbye, какой у вас алгоритм? Или подождем еще решателей?

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 19:35 
Заслуженный участник
Аватара пользователя


01/09/13
4676
Алгоритм Null на питоне:
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import datetime
t = datetime.datetime.now();
dt = datetime.timedelta(seconds=1);
sys.set_int_max_str_digits(10000);
N = 1000;
N += 1;
res = [0]*N;
tt = [0]*N;
Fl = [[0]*N];
Fl[0][-1] = 1;
for n in range(1,N):
        f = 0;
        for l in range(n):
                F = Fl[l];
                k = (n-l)*(n-l);
                r = 0;  ff = 0;
                for i in range(N-n,N):
                        F[i] *= k;
                        F[i-1] = ( _ := F[i]//(N-i) );
                        r = r*l+_;
                        ff = ff*(l+1)+_;
                F[-1] = f-r*l;
                f = ff*(l+1)+F[-1];
        ff = [0]*N;     ff[-1] = f;
        Fl.append(ff);
        res[n] = f;
        tt[n] = (datetime.datetime.now()-t)/dt;
print(len(str(res[-1])));
print(tt[::100]);
 

Результат:
Код:
4941
[0, 0.077507, 0.773941, 3.224009, 9.611014, 22.661707, 45.289982, 81.614997, 136.412417, 214.808085, 321.546689]


Null в сообщении #1600012 писал(а):
Сложность в любом случае $O(n^3\times(n))$(на длинную арифметику).

Получилось $\approx 3.8$

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 19:53 


05/09/16
12108
Ну в общем у меня считает все b до 500 за 14 секунд :mrgreen:
Код:
? b(n)=my(v1, v2,x='x,f11,f22,f24); v1=vector(n+1,i,(i-1)!); v2=v1; for(i=1,n,for(j=i,n,x=i;f11=eval(v1[j+1]);x='x;if(i==j,f22=0,f22=(i-j)^2*intformal(v2[j]));x=i;f24=eval(f22);x='x;v2[j+1]=f22+f11-f24); v1=v2); return(v1);
? b(500);
? ##
  ***   last result computed in 13,982 ms.
?


-- 05.07.2023, 20:08 --

maxal в сообщении #1600002 писал(а):
Вот мой код на PARI/GP. На моем компе вычисляет 500 членов за 8 секунд.

На мой планшет похоже, где-то 9 секунд ваш код у меня бежит.

-- 05.07.2023, 20:10 --

maxal в сообщении #1599995 писал(а):
eval лучше не использовать для вычисления значений многочленов (оно не использует схему Горнера). Подставлять значения $x$ в $f(x)$ можно так: subst(f,x,3) или если нет уверенности в имени переменной, то subst(f,variable(f),3).

Да, я мучился с subst по всякому, но так и не победил...

-- 05.07.2023, 20:16 --

kthxbye в сообщении #1600001 писал(а):
На моем ноуте он считает $400$ членов за $43$ секунды.

Хм... у вас небыстрый ноут, однако. Ваш код до 400 у меня проходит на планшете за 7 секунд...

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 20:27 
Заслуженный участник


12/08/10
1680

(A204264)

Можно аналогично A204264. Только отдельный элемент считает.
Код:
{ a204264(N) = my(a,f,g,x='x);
  a = vector(N);
  a[1] = 1;
  f = [x,N];
  for(n=2,N,
    g = List([n!*x^n]);
    for(l=1,n-1,
        listput(g, intformal((n-l)^2*f[l+1],x));
        g[#g] += subst(g[#g-1]-g[#g],x,N+1-l);
    );
    listput(g, a[n] = subst(g[#g],x,N+1-n) );
    f = g;
  );
  a[N];
}

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 20:32 


05/09/16
12108
Null
Что-то не так. Ошибку ищите
? print(a204264(5))
78745
?


P.S. А, сорри, у вас другая последовательность, не та что в стартовом посте у ТС. Тогда ошибки нет.

-- 05.07.2023, 20:59 --

kthxbye в сообщении #1599788 писал(а):
Geen в сообщении #1599785 писал(а):
Кстати, а сколько цифр в числе $b(500)$?

Судя по всему $2172$.

2167 вышло.

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 21:11 
Аватара пользователя


22/11/13
02/04/25
549
Стоило назвать алгоритм лучшим, как сразу же появились альтернативы (что хорошо и даже очень).

Null в сообщении #1600012 писал(а):
kthxbye, какой у вас алгоритм? Или подождем еще решателей?

У меня вот такой:
Код:
b(n)=my(v1, v2, v3, v4); v1=vector(n+1, i, 1); v2=v1; v3=vector(n+1, i, 0); v3[1]=1; v4=vector(n, i, vector(i+1, j, binomial(i, j-1)*j)); for(i=1, n, for(q=0, n-i, v2[q+1]=sum(j=0, q+1, v4[q+1][j+1]*v1[j+1])); v1=v2; v3[i+1]=v1[1];); v3

Он базируется на простой и элегантной формуле
$$R(n,q)=\sum\limits_{j=0}^{q+1}\binom{q+1}{j}(j+1)R(n-1,j), R(0,q)=1$$
где мы имеем $R(n,0)=b(n+1)$. К сожалению как его генерализировать хотя бы на ту же A204264 совершенно не представляю.

Может кто-нибудь оценить сложность моего алгоритма с помощью нотации "О" большое? Еще желательно проверить его скорость на современных устройствах.

wrest в сообщении #1600029 писал(а):
Хм... у вас небыстрый ноут, однако.

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

wrest в сообщении #1600034 писал(а):
2167 вышло.

У вас в результате просто нумерация начинается с двух единиц вместо одной. Имеем $b(1)=1, b(2)=3$. Но при этом, конечно, $b(0)=1$.

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 21:39 


05/09/16
12108
kthxbye в сообщении #1600035 писал(а):
У меня вот такой:

Это немного медленнее (процентов на 10-15%) кода ув. maxal, по крайней мере на моём планшете.

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 21:52 
Заслуженный участник


12/08/10
1680
kthxbye в сообщении #1600035 писал(а):
Может кто-нибудь оценить сложность моего алгоритма с помощью нотации "О" большое?
Тоже $O(n^3\times(n))$. Мы должны посчитать все $R(m,p)$ где $m+p\le n$ и на каждый $O(n)$ операций по формуле. И все та же длинная арифметика $O(n)$(на самом деле $O(n\log(n))$ как и у меня)

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение05.07.2023, 22:45 
Заслуженный участник
Аватара пользователя


01/09/13
4676
Null в сообщении #1600040 писал(а):
на самом деле $O(n\log(n))$

На самом деле меньше - у нас только сложение длинное, а умножение/деление везде только длинного числа на короткое.

 Профиль  
                  
 
 Re: Перманент матрицы
Сообщение06.07.2023, 01:06 


05/09/16
12108
maxal в сообщении #1599904 писал(а):
Вот реализация на Sage

Для примера вычисляет несколько первых членов и значение для $n=100$. В онлайне $n=500$ осилить не может, но локально оно тем же кодом вычисляется за 40 секунд.
maxal в сообщении #1600002 писал(а):
Вот мой код на PARI/GP. На моем компе вычисляет 500 членов за 8 секунд.

Скажите пож-ста, 40 секунд Sage и 8 секунд PARI/GP -- это один и тот же комп? В коде Sage как я понимаю включена мемоизация (хотя там мне кажется и хитов нету), так что рекурсия против прямого цикла вроде не проблема. Или разные компы?

-- 06.07.2023, 01:39 --

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 60 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Модераторы Математики, Супермодераторы



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

Сейчас этот форум просматривают: YandexBot [bot]


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

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