Wings 3D, tj. open source 3D modelovací program naprogramovaný v programovacím jazyce Erlang zaměřený na modelování pomocí subdivision a inspirovaný programy Nendo a Mirai od Izware, byl vydán v nové opravné verzi 2.4.1. Ke stažení již také ve formátu Flatpak z Flathubu.
Webový prohlížeč Dillo byl vydán ve verzi 3.2.0. Přidává podporu vzorců v SVG, obrázků ve WebP, změny velikosti stránky či možností posouvání. Nedávno oslavil 25. výročí vzniku.
Hra Mini Thief je na Steamu zdarma napořád, když aktivaci provedete do 24. ledna do 19.00 [ProtonDB].
Certifikační autorita Let's Encrypt oznámila, že bude volitelně nabízet krátkodobé certifikáty s šestidenní platností a navíc s možností vystavit je na IP adresu. Zvolit typ certifikátu bude možné v certifikačním profilu ACME.
Herní konzole Nintendo Switch 2 byla oficiálně potvrzena. Vyjde letos. Trailer na YouTube. Více ve středu 2. dubna na Nintendo Direct.
Byl vydán Linux Mint 22.1 s kódovým jménem Xia. Podrobnosti v přehledu novinek a poznámkách k vydání. Linux Mint 22.1 bude podporován do roku 2029.
Google Chrome 132 byl prohlášen za stabilní. Nejnovější stabilní verze 132.0.6834.83 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 16 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře (YouTube).
Byla vydána verze 11.0.0 knihovny libvirt (Wikipedie) zastřešující různé virtualizační technologie a vytvářející jednotné rozhraní pro správu virtuálních strojů. Současně byl ve verzi 11.0.0 vydán související modul pro Python libvirt-python. Přehled novinek v poznámkách k vydání.
Byla vydána nová verze 3.4.0 nástroje pro inkrementální kopírování souborů rsync (Wikipedie). Přehled oprav a vylepšení v souboru NEWS. Řešeno je 6 zranitelností.
V srpnu loňského roku byla vyhlášena RP2350 Hacking Challenge aneb oficiální výzva Raspberry Pi na prolomení bezpečnosti mikrokontroléru RP2350. Povedlo se. Včera byli představeni čtyři vítězové a jejich techniky.
Dělám do školy program na výpočet libovolného determinantu. Když jsem po týdnu vymyslel jak na to, tak mi to někde blbne. Nacpu tomu list (př [[1, 2, 3][4, 8, 7][8, 9, 6]]) vnořený list je řádek)
def detr(det, i): #Tohle upravuje determinant dělá z něj sub determinant K = det del K[0] for y in xrange(len(K)): del K[y][i] return K def determinant(det, stupen): if stupen == 2: d = det[0][0]*det[1][1] - det[0][1]*det[1][0] else: d = 0 for i in xrange(stupen): M = detr(det, i) print stupen d = d + (-1)**(i-1)*det[0][i]*determinant(M, (stupen -1) ) return dAž po první determinant 2. stupně to jede dobře, jenže když to má udělat další determinant 2. stupně, tak se to K zase zkrátí a já už prostě nevím, jak udělat to zkracovaní. Předem moc dík za každou radu. Vím, že existuje numpy, ale v zadání je zpracujte algoritmus. Kdyby měl někdo jiný nápad na řeší determinantů přivítal bych to.
Tiskni Sdílej:
Momentálně si vzpomenu jen na výpočet rozkladem a to by se snad dělalo rekurzí, když neznáš předem hodnost matice?
Ok, do pythonu jsem se ještě nedostal. Ten součet permutací, sudejch a lichejch sloupců a řádků asi zohledňuješ?
Mluvim o tom, že na řádku 1, skoupci 1, je determinant kladnej, na 1/2 je zápornejm na 2/2 kladnej ...
y = [1, 2, 3]
x = y
del x[0]
if y[0] == 2 :
print "true"
tak to vypíše true, protože přiřazení je přiřazení referencí jako v Javě. Dá se to spravit něčím jako x=y[:]
. Doporučuju přečíst si nějakou učebnici Pythonu, tohle by měl být základ.
Možná že to máš "dobře" (i když když to nefunguje tak asi těžko...), ale prakticky je to zcela nepoužitelný. Protože u algoritmu se složitostí O(n!) končíš na n v řádu jednotek.
Takže ten kód rovnou zahoď a napiš si prachobyčejnou Gaussovu eliminaci. Vynásobenim prvků na diagonále pak získáš determinant. Složitost O(n^3).
pr = r < vr ? r : r + 1; ps = s < vs ? s : s + 1;Ten zbytek už je jednoduchý.
Už jsem to pochopil.
Nepochopil. Zkus to tady, třeba tomu budeš rozumět v češtině líp.
Pokuď v GEM používáš pouze úpravu typu přičtení násobku řádku k jinému řádku jak je obvyklé, získáš determinant původní matice pouhým vynásobením prvků na diagonále trojúhelníkové matice vzniklé z matice původní pomocí GEM.
Nevím jaký je přesně zadání, ale pokuď v něm neni, že se MUSÍ použít výpočet pomocí subdeterminantů, tak výše uvedenj postup použít rozhodně lze. Naopak, pokuď v zadání není dáno, že musíš použít výpočet pomocí subdeterminantů, měl by tě s tím co tady "patláš" zadavatel okamžitě vyhodit. Protože s někým, kdo použije algoritmus s O(n!) tam, kde existuje jednodušší algoritmus s O(n^3) se nic jinýho udělat nedá...
Tyjo to jsem dělal ještě na střední ve druháku. Můžu dát jedině kód v C#, ale nijak za něj neručím, v té době jsem ještě ani nevěděl, co je to lineární algebra a C# jsem taktéž moc neovládal. Takže nepište že jsem vůl a tak.
using System;
namespace Calc
{
public class Matrix
{
protected double[,] MatrixData;
protected int my, nx;
//
//INDEXER
//
//for access to mambers
//arrays are indexing from 0! but matrix from 1
public double this [int m, int n]
{
get
{
return MatrixData[m-1, n-1];
}
set
{
MatrixData[m-1, n-1] = value;
}
}
//
//CONSTRUCTORS
//
//constructor with size of MatrixData
public Matrix(int m, int n)
{
//m+1 and n+1 for counting from 1 (matrix is a11 .. amn)
MatrixData = new double[m, n];
my = m;
nx = n;
}
//matrix from array and size
public Matrix(double[,] MatrixArray, int m, int n)
{
MatrixData = new double[m, n];
for(int x = 0; x <= m-1; x++)
for(int y = 0; y <= n-1; y++)
MatrixData[x, y] = MatrixArray[x, y];
my = m;
nx = n;
}
//new matrix from existing matrix
public Matrix(Matrix ExistingMatrix)
{
MatrixData = ExistingMatrix.GetMatrix();
my = ExistingMatrix.GetM();
nx = ExistingMatrix.GetN();
}
//
//OPERATORS
//
//addition Matrix+Matrix
public static Matrix operator+(Matrix A, Matrix B)
{
//size of matrix must be the same as A and B
Matrix C = new Matrix(A);
for(int m = 1; m <= A.GetM(); m++)
for(int n = 1; n <= A.GetN(); n++)
C[m, n] = A[m, n] + B[m, n];
return C;
}
//multiply Matrix*Matrix
public static Matrix operator*(Matrix A, Matrix B)
{
Matrix C = new Matrix(A.GetM(), B.GetN());
double sum;
for(int m = 1; m <= A.GetM(); m++)
for(int n = 1; n <= B.GetN(); n++)
{
sum = 0;
for(int i = 1; i <= A.GetN(); i++)
sum += A[m, i] * B[i, n];
C[m, n] = sum;
}
return C;
}
//multiply double*Matrix
public static Matrix operator*(double a, Matrix B)
{
Matrix C = new Matrix(B);
for(int m = 1; m <= B.GetM(); m++)
for(int n = 1; n <= B.GetN(); n++)
C[m, n] = a * B[m, n];
return C;
}
//multiply Matrix*double
public static Matrix operator*(Matrix A, double b)
{
return b * A;
}
//compare
public static bool operator==(Matrix A, Matrix B)
{
return A.Equals(B);
}
//compare
public static bool operator!=(Matrix A, Matrix B)
{
return !A.Equals(B);
}
//invert
public static Matrix operator~(Matrix X)
{
return X.Invert();
}
//
//GETS
//
//returns array with matrix
public double[,] GetMatrix()
{
return (double[,])MatrixData.Clone();
}
//returns m - y size
public int GetM()
{
return my;
}
//returns n - x size
public int GetN()
{
return nx;
}
public override bool Equals(object obj)
{
if(obj is Matrix)
{
Matrix A = (Matrix)obj;
for(int m = 1; m <= this.GetM(); m++)
for(int n = 1; n <= this.GetN(); n++)
if(this[m, n] == A[m, n])
return true;
return false;
}
else
return false;
}
//
//COUNTING
//
//second determinant
public double Determinant2()
{
return this[1, 1] * this[2, 2] -
this[1, 2] * this[2, 1];
}
//third determinant
public double Determinant3()
{
return this[1, 1] * this[2, 2] * this[3, 3] -
this[1, 1] * this[2, 3] * this[3, 2] +
this[1, 2] * this[2, 3] * this[3, 1] -
this[1, 2] * this[2, 1] * this[3, 3] +
this[1, 3] * this[2, 1] * this[3, 2] -
this[1, 3] * this[2, 2] * this[3, 1];
}
//n-scale determinant
public double Determinant(int n)
{
switch(n)
{
case 2:
return Determinant2();
case 3:
return Determinant3();
default:
double result = 0;
for(int i = 1; i <= this.GetN(); i++)
result += this[1, i] * this.Addition(1, i);
return result;
}
}
//addition of mamber
public double Addition(int m, int n)
{
Matrix X = new Matrix(this.GetM()-1, this.GetM()-1);
int i = 1, j;
for(int x = 1; x <= this.GetM(); x++)
{
j = 1;
for(int y = 1; y <= this.GetM(); y++)
{
if(m != x && n != y)
{
X[i, j] = this[x, y];
j++;
}
}
if(x != m)
i++;
}
return System.Math.Pow(-1, m+n) * X.Determinant(this.GetM()-1);
}
//invert matrix
public Matrix Invert()
{
Matrix X = new Matrix(this.GetM(), this.GetM());
for(int m = 1; m <= this.GetM(); m++)
for(int n = 1; n <= this.GetN(); n++)
X[n, m] = this.Addition(m, n);
return (1/this.Determinant(this.GetM())) * X;
}
//rotate matrix right
public void RotateRight()
{
Matrix X = new Matrix(this.GetN(), this.GetM());
for(int m = 1; m <= this.GetM(); m++)
for(int n = 1; n <= this.GetN(); n++)
X[n, this.GetM() - m + 1] = this[m, n];
MatrixData = X.GetMatrix();
my = X.GetM();
nx = X.GetN();
}
public Matrix Transpone()
{
Matrix X = new Matrix(this.GetN(), this.GetM());
for(int m = 1; m <= this.GetM(); m++)
for(int n = 1; n <= this.GetN(); n++)
X[n, m] = this[m, n];
return X;
}
public override string ToString()
{
string s = "";
for(int m = 1; m <= this.GetM(); m++)
{
s += "(";
for(int n = 1; n < this.GetN(); n++)
s += this[m, n].ToString() + "; ";
s += this[m, this.GetN()].ToString() + ")\n";
}
return s;
}
public object Clone()
{
return new Matrix(this);
}
}
}
Jeho jediným problémem je, že se v něm asi dá těžko dělat v týmu...Řekl bych, že existence CPANu to dosti přesvědčivě vyvrací
Neznám Python ani Perl, ale Python opravdu není "jen hezčí Perl".To zrovna nezní jako kvalifikovaný názor
to nie, on je len obeťou masívnej ohováracej kampane tých, čo mu nie sú schopní porozumieť
from numpy import matrix from scipy.linalg import det A = matrix([[1,2],[3,4]]) print det(A)
#!/usr/bin/python def detr(det, i): K = det del K[0] for y in xrange(len(K)): del K[y][i] return K def determinant(det, stupen): print "Stupen1: " , stupen if stupen == 2: print "Stupen2a: " , stupen d = det[0][0]*det[1][1] - det[0][1]*det[1][0] else: print "Stupen2b: " , stupen d = 0 print "len det 0 " , len(det[0]) for i in xrange(stupen): M = detr(det, i) print "det[0][",i,"]=",det [0][i] print "M=",M print "det=",det d = d + (-1)**(i-1)*det[0][i]*determinant(M, (stupen -1) ) print "Subdeterminant pro " , stupen , " je " , d return d mat=[[1, 2, 3],[4, 8, 7],[8, 9, 6]] print determinant(mat,len(mat));Bohuzel mi to ale hlasi chybu - tohle je cely vystup z toho programu.
Stupen1: 3 Stupen2b: 3 len det 0 3 det[0][ 0 ]= 8 M= [[8, 7], [9, 6]] det= [[8, 7], [9, 6]] Stupen1: 2 Stupen2a: 2 Subdeterminant pro 2 je -15 det[0][ 1 ]= Traceback (most recent call last): File "./det.py", line 30, in ? print determinant(mat,len(mat)); File "./det.py", line 21, in determinant print "det[0][",i,"]=",det [0][i] IndexError: list index out of rangePokud jsem python dobre pochopil a podle vypisu interpretoval, tak python predava seznamy jako odkazy a nedela kopie. Cili, jakakoliv destruktivni zmena seznamu K (resp. parametru "det") ve funkci detr se projevi zmenou puvodniho seznamu "det" ve funkci determinant. Jak jsem psal, nejsem pythonista, takze ti neporadim, jak udelat kopii seznamu a predat do funkce k destrukci tak, aby puvodni seznam zustal, ale nejakej pythonista by to vedet mohl. Zkusim jeste mrknou na nejaky ucebnice, neco by se najit mohlo.
#!/usr/bin/perl sub detr { my ($i,$k)=@_; my $r=[]; for (my $y=1;$y<scalar(@{$k});$y++) { push @{$r},[@{$k->[$y]}]; splice @{$r->[$y-1]},$i,1; } return $r; } sub determinant { my ($det)=@_; my $stupen=scalar(@{$det}); if ($stupen==1) { return $det->[0][0]; } elsif ($stupen==2) { return $det->[0][0]*$det->[1][1]-$det->[0][1]*$det->[1][0]; } else { my $d=0; for (my $i=0;$i<$stupen;$i++) { my $m=detr($i,$det); $d+=(-1)**($i)*$det->[0][$i]*determinant($m); } return $d; } } $mat=[ [1,2,3], [4,8,7], [8,9,6] ]; print determinant($mat) . "\n";A mam k tomu par komentaru:
(-1)**(i-1)
, ale spravne ma byt (-1)**i
, protoze ten vzorecek je spravne (-1)**(radek+sloupec)
takze zacinas 0+0, coz je nula a -1 na nultou je jedna kladna, takze je to dobre, ale tobe vychazi pro prvni hodnotu, kdy i==0, -1 na -1, coz je -1 a to je spatne.$a=[ [1,2,3] ]; $b=[ [@{$a->[0]}] ];ono to sice vypada neprehledne, ale pokud clovek zna aspon zaklady perlu, tak to uvidi hned. $a je reference na anonymni array, ktery obsahuje jeden prvek a tim je odkaz na anonymni array se tremi prvky 1, 2 a 3. Na druhem radku pak vytvarim do promenne $b referenci na jiny anonymni array, do ktereho vlozim jeden prvek, ktery je odkaz na dalsi anonymni pole, do ktereho vlozim hodnoty - a ty se vlozit zpusobem takovym, ze se odkazu na 1.prvek (index 0) anonymniho pole odkazovaneho promennou $a
$a->[0]
, tento prvek obsahuje odkaz na anonymni pole s prvky 1, 2, 3, takze to necham vyhodnotit jako obycejne pole @{$a->[0]}
, coz bude prave to pole tech hodnot (uz to tedy nebude odkaz na to anonymni pole, ale konkretni -zkopirovane- hodnoty) a ty se mi vlozi do toho noveho anonymniho pole [ @{$a->[0]} ]
, ktere je ulozene jako prvni prvek celeho anonymniho pole odkazovaneho prom. $b = [ [ @{$a->[0]} ] ]
Kdyz se pokusim v pythonu udelat tohle
>>> a=[ [ 1,2,3] ] >>> b=[] >>> c=[] >>> b+=[a[0]] >>> c.append(a[0]) >>> a [[1, 2, 3]] >>> b [[1, 2, 3]] >>> c [[1, 2, 3]] >>> del b[0][1] >>> del c[0][1] >>> a [[1]] >>> b [[1]] >>> c [[1]]vidite sami, ze oba zpusoby
b+=...
i c.append
nevlozi konkretni hodnoty, ale referenci. V docu k pythonu to pisou, ze se kopiruje reference, ale nenasel jsem nic o tom, jak seznam vratit jako novy seznam hodnot.
#!/usr/bin/perl use Data::Dumper; sub detr { my ($i,$k)=@_; my $r=[]; for (my $y=1;$y<scalar(@{$k});$y++) { push @{$r},[@{$k->[$y]}]; splice @{$r->[$y-1]},$i,1; } return $r; } sub determinant { my ($det)=@_; my $stupen=scalar(@{$det}); if ($stupen==1) { return $det->[0][0]; } else { my $d=0; for (my $i=0;$i<$stupen;$i++) { my $m=detr($i,$det); $d+=(-1)**($i)*$det->[0][$i]*determinant($m); } return $d; } } $mat=[ [1,2,3], [4,8,7], [8,9,6] ]; print determinant($mat) . "\n";
a=[[1], [2], [3], [4], [5, "a"]] for i in range(0,len(a)): b=a[:i]+a[i+1:] print bJinak vytvoření kopie listu není problém:
b=list(a)
a=[1,2,3]
b=a[:]
a nebo modul copy a funkce deepcopy:)
#!/usr/bin/python # vim:set et: def detr(det, i): K = [] for y in range(1,len(det)): K.append(det[y][:i]+det[y][i+1:]) return K def determinant(det, stupen): if stupen == 2: d = det[0][0]*det[1][1] - det[0][1]*det[1][0] else: d = 0 for i in xrange(stupen): M = detr(det, i) d = d + (-1)**i*det[0][i]*determinant(M, (stupen -1) ) return d mat=[[1, 2, 3],[4, 8, 7],[8, 9, 6]] print determinant(mat,len(mat));a pak jeste pokud bys chtel koncit az ve stupni 1
#!/usr/bin/python # vim:set et: def detr(det, i): K = [] for y in range(1,len(det)): K.append(det[y][:i]+det[y][i+1:]) return K def determinant(det, stupen): if stupen == 1: d = det[0][0] else: d = 0 for i in xrange(stupen): M = detr(det, i) d = d + (-1)**i*det[0][i]*determinant(M, (stupen -1) ) return d mat=[[1, 2, 3],[4, 8, 7],[8, 9, 6]] print determinant(mat,len(mat));No, vypada to, ze to chodi. Tak snad to pomuze.
Vždycky mě dostane do kolen, když script-kiddies hodlají "optimalizovat" svůj algoritmus s exponenciální složitostí pro problém, kde existuje řešení s polynomiální složitostí pomocí podobnejch metod...
Pro ty co by snad na tuhle diskuzi narazili někdy v budoucnu a chtěli odsud kopírovat některý z uvedených kódů v příloze uvádim obrázek, po jehož shlédnutí by si to měl rozmyslet i negramotný chovanec Guatemalského ústavu pro choromyslné...
mat A[X,X]=[ hodnoty matice] det(A)a mam vypocet rychle a presne (prepokladam, ze v takovym programu budou pouzity jedny z nejrychlejsich algoritmu). Nicmene, hledani chyb v cizich programech je dobra skola programovani. Clovek u toho musi premyslet, co tim chtel autor vlastne rict a kde je teda chyba.
V gnuplotu.
set terminal png size 500,300 set output "determinant.png" set xrange [0:8] set grid set xlabel "Velikost matice" set ylabel "Čas výpočtu" plot x**3 title "Gaussova eliminace", \ sqrt(2*pi*x)*x**x * exp(-x) title "Metoda kofaktorů"
Možná ještě jeden "údernější":
set terminal png size 500,300 set output "determinant.png" set xrange [2:100] set logscale y set grid set title "Porovnání výpočetní složitosti determinantu matice" set xlabel "Velikost matice" set ylabel "Čas výpočtu" plot x**3 title "Gaussova eliminace", \ sqrt(2*pi*x)*x**x * exp(-x) title "Metoda kofaktorů"
Chápu Gaussovu eliminaci dobře
Ne tak docela. LU dekompozice není částí Gaussovy eliminace. Zjednodušeně řečeno je LU dekompozice modifikovanou Gaussovou eliminací.
LU dekompozice rozkládá původní matici na součin dou trojúhelníkových matic (jedna dolní a jedna horní), Gausova eliminace matici pouze upravuje na horní trojúhelníkový tvar. K efektivnímu výpočtu determinantu se nicméně dá použít jak LU dekompozice tak Gaussova eliminace.
Jinak "finta" je skutečně v tom, že jediný nenulový součin z výpočtu determinantu je u trojúhelníkové matice právě ten na diagonále.