Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 209. brněnský sraz, který proběhne tento pátek 16. května od 18:00 ve studentském klubu U Kachničky na Fakultě informačních technologií Vysokého učení technického na adrese Božetěchova 2/1. Jelikož se Brno stalo jedním z hlavních míst, kde se vyvíjí open source knihovna OpenSSL, tentokrát se OpenAlt komunita potká s komunitou OpenSSL. V rámci srazu Anton Arapov z OpenSSL
… více »GNOME Foundation má nového výkonného ředitele. Po deseti měsících skončil dočasný výkonný ředitel Richard Littauer. Vedení nadace převzal Steven Deobald.
Byl publikován přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie) za uplynulé dva měsíce. Servo zvládne už i Gmail. Zakázány jsou příspěvky generované pomocí AI.
Raspberry Pi Connect, tj. oficiální služba Raspberry Pi pro vzdálený přístup k jednodeskovým počítačům Raspberry Pi z webového prohlížeče, byla vydána v nové verzi 2.5. Nejedná se už o beta verzi.
Google zveřejnil seznam 1272 projektů (vývojářů) od 185 organizací přijatých do letošního, již jednadvacátého, Google Summer of Code. Plánovaným vylepšením v grafických a multimediálních aplikacích se věnuje článek na Libre Arts.
Byla vydána (𝕏) dubnová aktualizace aneb nová verze 1.100 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.100 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána v nové verzi 2025.5.
OpenSearch (Wikipedie) byl vydán ve verzi 3.0. Podrobnosti v poznámkách k vydání. Jedná se o fork projektů Elasticsearch a Kibana.
PyXL je koncept procesora, ktorý dokáže priamo spúštat Python kód bez nutnosti prekladu ci Micropythonu. Podľa testov autora je pri 100 MHz približne 30x rýchlejší pri riadeni GPIO nez Micropython na Pyboard taktovanej na 168 MHz.
Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 12.0. Přehled novinek v aktualizované dokumentaci.
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.
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: