Probíhá Meta Connect 2023. Společnost Meta představuje své novinky v oblasti AI a virtuální, smíšené a rozšířené reality. Představeny byly nové chytré brýle Ray-Ban | Meta a headset Meta Quest 3.
Eben Upton oficiálně představil (YouTube) nové Raspberry Pi 5 (YouTube). Je více než 2x výkonnější než jeho předchůdce, model 4B.
Byl vydán (YouTube) Counter-Strike 2. Nativně také pro Linux. Jedná se o největší technologický skok v historii této populární herní série.
Richard Stallman vystoupí v Praze s přednáškou Free Software And Your Freedom. V sobotu 30. září ve 14:30 na Pedagogické fakultě UK a v neděli 1. října v 18:00 hodin v rámci konference Hackers Congress Paralelní Polis.
Byla vydána verze 6 s kódovým název Faye linuxové distribuce LMDE (Linux Mint Debian Edition). Podrobnosti v poznámkách k vydání. Linux Mint vychází z Ubuntu. LMDE je postaveno na Debianu.
Byly publikovány informace o novém bezpečnostním problému pojmenovaném GPU.zip (paper, GitHub). S vlastním logem. Jedná se o možný útok postranním kanálem na grafickou kartu (GPU). Proces může "krást pixely" jinému procesu.
Projekt GNU dnes slaví 40. výročí. Přesně před čtyřiceti lety, 27. září 1983, Richard Stallman oznámil, že se chystá napsat s Unixem kompatibilní operační systém GNU (Gnu's Not Unix). Hlavní oslava a setkání hackerů probíhá ve Švýcarsku ve městě Biel/Bienne. Na programu je také přednáška Richarda Stallmana.
Byl vydán Mozilla Firefox 118.0. Přehled novinek v poznámkách k vydání, poznámkách k vydání pro firmy a na stránce věnované vývojářům. Vypíchnout je nutno automatický lokální strojový překlad webových stránek. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 118 je již k dispozici také na Flathubu a Snapcraftu.
Byla vydána nová major verze 15.0.0 softwaru OCRmyPDF pro přidávání textové vrstvy k naskenovaným PDF dokumentům (PDF/A). Přehled novinek v poznámkách k vydání. OCRmyPDF využívá pro optické rozpoznávání znaků (OCR) engine Tesseract.
Karel Matějka zveřejnil druhé demo své chystané hry Bzzzt. Kromě verze pro Windows a macOS je dostupná i verze pro Linux. Plná verze hry má vyjít zanedlouho.
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: