Eric Lengyel dobrovolně uvolnil jako volné dílo svůj patentovaný algoritmus Slug. Algoritmus vykresluje text a vektorovou grafiku na GPU přímo z dat Bézierových křivek, aniž by využíval texturové mapy obsahující jakékoli předem vypočítané nebo uložené obrázky a počítá přesné pokrytí pro ostré a škálovatelné zobrazení písma, referenční ukázka implementace v HLSL shaderech je na GitHubu. Slug je volným dílem od 17. března letošního
… více »Sashiko (GitHub) je open source automatizovaný systém pro revizi kódu linuxového jádra. Monitoruje veřejné mailing listy a hodnotí navrhované změny pomocí umělé inteligence. Výpočetní zdroje a LLM tokeny poskytuje Google.
Cambalache, tj. RAD (rapid application development) nástroj pro GTK 4 a GTK 3, dospěl po pěti letech vývoje do verze 1.0. Instalovat jej lze i z Flathubu.
KiCad (Wikipedie), sada svobodných softwarových nástrojů pro počítačový návrh elektronických zařízení (EDA), byl vydán v nové major verzi 10.0.0 (𝕏). Přehled novinek v příspěvku na blogu.
Letošní Turingovou cenu (2025 ACM A.M. Turing Award, Nobelova cena informatiky) získali Charles H. Bennett a Gilles Brassard za základní přínosy do oboru kvantové informatiky, které převrátily pojetí bezpečné neprolomitelné komunikace a výpočetní techniky. Jejich protokol BB84 z roku 1984 umožnil fyzikálně zaručený bezpečný přenos šifrovacích klíčů, zatímco jejich práce o kvantové teleportaci položila teoretické základy pro budoucí kvantový internet. Jejich práce spojila fyziku s informatikou a ovlivnila celou generaci vědců.
Firefox 149 dostupný od 24. března přinese bezplatnou vestavěnou VPN s 50 GB přenesených dat měsíčně (s CZ a SK se zatím nepočítá) a zobrazení dvou webových stránek vedle sebe v jednom panelu (split view). Firefox Labs 149 umožní přidat poznámky k panelům (tab notes, videoukázka).
Byla vydána nová stabilní verze 7.9 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 146. Přehled novinek i s náhledy v příspěvku na blogu.
Dle plánu byla vydána Opera GX pro Linux. Ke stažení je .deb i .rpm. V plánu je flatpak. Opera GX je webový prohlížeč zaměřený na hráče počítačových her.
GNUnet (Wikipedie) byl vydán v nové major verzi 0.27.0. Jedná se o framework pro decentralizované peer-to-peer síťování, na kterém je postavena řada aplikací.
Byly publikovány informace (technické detaily) o bezpečnostním problému Snapu. Jedná se o CVE-2026-3888. Neprivilegovaný lokální uživatel může s využitím snap-confine a systemd-tmpfiles získat práva roota.
Ahoj všichni. Potřeboval bych vyrobit algoritmus na zjištění všech dělitelů zadného čísla... Pokud máte nějaké nápady, sem s tím.
Např. číslo 10 ... (10/5/2/1)
Děkuju moc.
forcyklem od 1 do cisla, ktere mas zadaneZbytecne dlouhe. Staci od 2 (kazde cislo je delitelne 1 a samo sebou) do
SQRT(cislo) (do druhe odmocniny - SQRT(cislo) * SQRT(cislo)= cislo) a ukladat delitele i vysledek.Nikoliv prvočísla jsou klíčem. Protože pokud se vám číslo N podaří rozložit na prvočísla a_i, v následující notaci:
N= a_1 × a_2 × ...;
Pak každá vlastní podmnožina množiny s prvky a_i odpovídá právě jednomu děliteli.Hodnota dělitele je rovna součinu prvků této podmnožiny.
Postupoval bych tak, že bych získal na internetu zeznam prvočísel (pole P). Algoritmus by pak byl následující (neodladěný nástin algoritmu).
/* pole A - provočísla v N. pole B kardinalita prvočísla v rozkladu
na začátku je pole B vynulováno*/
k=0;
l=0;
count=0;
while ( N > 1) {
if N mod P[k] == 0 {
A[l] = P[k];
B[l]++;
N=N/B[k];
count++;
} else {
k++;
if B[l]>0 {
l++;
}
}
}
/* V poli A máme rozklad na prvočísla. Ted jeste pronasobit.
Místní validátor mrší kód a podruhé to psát nebudu.
Tak to budete muset vymyslet samostatně.*/
Seznam prvočísel je zbytečný, stačí si vytvořit sezman prvočíselných dělitelů. Navíc zapomínáte na to, že N může být dělitelné i vyšší mocninou některého prvočísla. Takže začnu s p=2 a budu zkoušet dělitelnost. Když narazím na dělitele, zapíšu si ho do pomocné struktury a zjistím maximální mocninu p, která dělí N (a poznamenám si ji k tomu děliteli). N vydělím touto mocninou (to se udělá jako vedlejší produkt v průběhu jejího zjišťování) a pokračuji dál. Končím v okamžiku, kdy p^2 > N. Je-li v tu chvíli N>1, je to poslední prvočíselný dělitel.
Výsledkem je pole, kde mám prvočíselný rozklad (prvočísla p_i a mocniny a_i). Zbývá vygenerovat seznam dělitelů, což je ekvivalentní všem možnostem, jak jednotlivým prvočíslům p_i přiřadit mocniny od nuly do a[i]. To už si laskavý čtenář udělá za cvičení, aby si ten zápočet aspoň nějak zasloužil. :-)
Technická poznámka: pokud by to náhodou nebyl úkol a ten program se měl použít v praxi, tak takhle komplikovaně to má smysl dělat jen pro velká N, pro menší je daleko jednodušší (a nezřídka i rychlejší) použít nějaký hrubonásilný přístup.
N průběžně klesá. Když vezmu extrémní případ, pro N = 2^k dostanete výsledek v čase sqrt(N) = 2^(k-1), u mne to bude k = log_2 N. V opačném extrému (N je prvočíslo) na tom budeme oba stejně.
sqrt(N) = 2^(k/2), ale na principu to nic nemění.
algoritmus je opravdu pro cislo N slozene z vice prvocisel podstatne rychlejsi.
predpoklad N = product(i=1..k, p_i ^ alpha_i)
analyza prvocisel cca sqrt(N)
vycisleni ruznych permutaci product(i=1..k, alpha) << N odhadoval bych cca O( ln N )
vycisleni delitele pomoci permutace k
takze celkem bych ocekaval slozitost O(sqrt(N)). to bude plati i pro N prvocislo
IMO lepší je čas. složitost udávat jako funkci závislou na délce vstupu
pouzij hlavu Hlavsone, toto je ukol zhruba tak pro ctvrtou tridu zakladni skoly
No na ten trivialni algoritmus "zkusim vsechna mensi cisla, zda jsou delitelem" by podle mne melo prijit i hodne male dite, urcite na prvnim stupni ZS. Omezeni na cisla <= odmocnina bych videl tak na sestou tridu u deti co je zajima matematika, nejake vylepseni pres prvocinitele pak treba osma trida (bez dukazu slozitosti apod.). Samozrejme inplementace v C++ je neco jineho, ne kazdy zna C++, ale myslenkove to opravdu neni nic extra sloziteho. Narazel jsem puvodne hlavne na to, ze zakladni reseni by pravdepodobne bylo hotove v dobe zhruba srovnatelne s napsanim dotazu do poradny...
Narazel jsem puvodne hlavne na to, ze zakladni reseni by pravdepodobne bylo hotove v dobe zhruba srovnatelne s napsanim dotazu do poradny...
Řekl bych, že toho, pro koho tohle platí, vůbec nenapadne sem takový dotaz dát. Dá-li ho sem někdo, pak to nejspíš bude ten, kdo tu úlohu není schopen vyřešit vůbec. Otázkou ovšem je, jestli je vhodné, aby takový člověk studoval školu, kde po něm podbné věci chtějí…
Tak tady to je....
prev>>a;
b=a;
for(;b>0;b--)
{
if(a%b==0)
{
vypis....
}
}
Asi nejsrozumitelnější řešení... 
for(b=a; b<0; b--) {
if(a%b == 0) {
výpis
}
}
no nic proti hrubé síle, když na to máte dost času...
perl -le 'print for grep ! ($ARGV[0] % $_), 1 .. $ARGV[0]' 10000
Ještě na tom bude potřeba zapracovat:
mike@unicorn:~/tmp> g++ -c x.cc x.cc:1:10: warning: character constant too long for its type x.cc:1: error: expected constructor, destructor, or type conversion before ‘-’ token
:-)
$ cat x.adb perl -le 'print for grep ! ($ARGV[0] % $_), 1 .. $ARGV[0]' 10000 $ gnat make x gcc -c x.adb x.adb:1:01: compilation unit expected gnatmake: "x.adb" compilation error
program delitel;
type
TPole= array[0..0] of integer;
PPole= ^TPole;
var
n, i: integer;
P: PPole;
x: integer= 0;
begin
read(n);
GetMem(P, n*SizeOf(integer));
for i:=1 to n do
if n mod i = 0 then
begin
P^[x]:=1;
inc(x);
end;
for i:=0 to x do write(' ', P^[i]);
end;
Pro prirozena cisla a v Haskellu
:
delitele x = filter ((== 0) . mod x) [1..x]
A co z toho plyne? Takhle "efektivně" to zvládnu i v tom C++:
for (i=1;i<=N;i++) if (!(N%i)) s << i << "\n";
Dokonce i ta délka je přibližně stejná. Kdybych si pamatoval prioritu operátorů, možná bych ušetřil ještě dvě závorky.
Takhle "efektivně" to zvládnu i v tom C++:
Já nikde netvrdím, že ne.
Mj. podívejte se na kód v Haskellu, je mnohem přehlednější než ten váš, protože používá standardní funkci (dalo by se říci: návrhový vzor) filter.
je mnohem přehlednější než ten váš, protože používá standardní funkci (dalo by se říci: návrhový vzor) filter.
Tomuto argumentu nerozumím. Já snad v tom kódu používám něco nestandardního? Co se přehlednosti týká, zkuste si to upravit aspoň tak, abyste necyklil do N ale jen do odmocniny a hned se vám to trochu zkomplikuje. Kdyby mi šlo o přehlednost, zvolil bych samozřejmě jiné formátování.
Ale nenechte se odradit mou skepsí, já jsem prostě starý bručoun, který neochotně podléhá módním vlnám a bere s rezervou podobné ukázky toho, jak se v těch revolučních jazycích třeskutě elegantně (a často zoufale neefektivně) řeší pečlivě vybrané (a většinou velmi umělé) úlohy.
Tou přehledností jsem měl na mysli spíše to, že v imperativních jazycích se zatím běžně používájí konstrukce for, if atd. Problém je, že tyto konstrukce jsou velmi obecné, zatímco ve funkcionálních jazycích se používají konstrukce s funkcemi map, filter, foldl, což jsou méně obecné konstrukce a osobně, když vidím třeba map f l, hned vím, že výsledekm je seznam stejně dlouhý jako seznam l a také vím, jaký typ mají prvky uvnitř seznamu (to určím z typu funkce f).
Jinak řečeno, když vidím standardní funkci map, filter anebo foldl, tak už tuším, co bude kód dělat. Zatímco, když vidím for cyklus, tak toho moc nevím. Mj. podobné věci se stále více objevují i v běžně používaných jazycích.
Nebojte, odradit se nenechám
Ale uvažte, že tyto, jak říkáte módní jazyky, jsou zdrojem nových featur pro ty běžně používané jazyky. A možná i díky jazykům jako je Haskell se dočkáme rozšíření trochu pokročilejších typových systémů do běžné praxe.
Podívejte se třeba, jak pěkně lze v Haskellu napsat parser pro escape sekvenci:
-- | Parses escape sequence.
escape :: Parsec String st Char
escape = backslash *> (p_char <|> p_num <|> p_any) <?> "escape sequence"
where
-- Parses single-character escape sequence (from table @chars@).
p_char = lookup' chars <$> (oneOf . fst . unzip $ chars)
-- Parses numeric escape sequence. Numeric escape sequence starts
-- with @x@ or @u@.
p_num = toEnum . fst . head . readHex
<$> (try (oneOf "xu" >>
between (char '{') (char '}') (many1 hexDigit))
<|> char 'x' *> count 2 hexDigit
<|> char 'u' *> count 4 hexDigit)
-- Parses other escape sequences.
p_any = anyChar
chars = zip escapeCodes escapeChars
Ano, v lexu by toto bylo přehlednější a kratší. Ale lex/bison je nemodulární řešení -- já tento parser (nebo lexer, ale obecně s knihovnou Parsec mohu udělat parser LL gramatiky) mohu složit s jinými a poskládáním menších parserů mohu vytvořit jeden velký parser. Navíc s knihovnou Parsec mohu ovlivnit chybová hlášení, která parser zobrazí uživateli.
Síla C a C++ je v jejich univerzalitě, ne v tom, že napíšu konkrétní šikovně vybranou úlohu o řádek kratšeji a a s hezčím zdrojákem, abych dělal dojem v diskusi.
Haskell není jazyk zaměřený na jednu vybranou úlohu viz třeba HackageDB.
Haskell není jazyk zaměřený na jednu vybranou úlohu viz třeba HackageDB.
Ale no tak… Předpokládám, že není nutné, abych to porovnával s tím, kolik knihoven a frameworků je k dispozici pro C a C++. Není vyloučeno, že časem Haskell dospěje do podoby jazyka pro široké spektrum uplatnění a že se bude opravdu široce používat. Ale zatím je podle mne jásání a předhazování Haskellu jako léku na neduhy C/C++ a budoucnosti programování předčasné. V tomhle jsem prostě skeptik. Zažil jsem vlny nadšení z Prologu, Lispu, Forthu, dnes je v módě Haskell, ale vždycky to byly a vždy to zůstaly spíš akademické záležitosti. Chlebem programátorského světa jsou už po desítky let procedurální jazyky a zatím mne nic nepřesvědčilo, že se to v dohledné době zásadním způsobem změní.
Ten odkaz jsem dal proto, aby bylo vidět, že se v Haskellu řeší různorodé problémy.
IMO funkcionální programování se stále více a více prosazuje, důkazem toho může být třeba F#, což je upravený OCaml. Já neříkám, že se bude programovat čistě funkcionálně (tj. tak jako v Haskellu), ale myslím si, že mnoho prvků z těchto jazyků se postupně objeví v mainstreamových jazycích.
, dnes nejsou procedurální jazyky, ale jazyky objektové. Jenže zatímco typové systémy procedurálních jazyků jsou dnes velmi pokročilé (Ada), typové systémy běžných objektových jazyků jsou prakticky zoufale impotentní. A s tím významně souvisí vyjadřovací schopnost těchto jazyků a produktivita jejich uživatelů. Proto se někteří lidé utíkají k funkcionálním jazykům. A je pravda, že některé jejich vlastnosti pomalu prosakují do mainstreamu (C#).
nejsou procedurální jazyky, ale jazyky objektové
Pominu-li různé specialitky, není ve filosofii mezi klasickými procedurálními a objektově orientovanými jazyky zase až tak zásadní rozdíl. Tedy aspoň ne z pohledu diskuse, kde je na jedné straně C/C++ a na druhé Prolog, Lisp nebo Haskell.
Díky, je to docela pěkné.
Ale nevýhoda C++ je, že máte jen omezený počet operátorů s předem danými prioritami. Výhodou Haskellu je lazy evaluation. Mj. našel jsem sbírku podobných knihoven jako je Parsec.
A dovolím si ještě jednu poznámku. Kdyby nebylo takovýchto jazyků, tak bychom třeba ani neuměli derivovat datové struktury nebo bychom pro to neměli praktické uplatnění.
nebo bychom pro to neměli praktické uplatnění.
Jinak řečeno: nebýt takových jazyků, neuměli bychom to, ale bylo by nám to jedno, protože bychom to vlastně ani nepotřebovali. :-)
Hledej na google: quadratic sieve, Kod urcite nebude tak elegantni jako jedna radka v haskelu, ale rozhodne to bude "pouzitelnejsi".
Tiskni
Sdílej: