diff options
author | Anton Luka Šijanec <anton@sijanec.eu> | 2022-05-01 02:29:54 +0200 |
---|---|---|
committer | Anton Luka Šijanec <anton@sijanec.eu> | 2022-05-01 02:29:54 +0200 |
commit | 7f8d80fc2f1eeb9b3c741592ba0062c60642110e (patch) | |
tree | b2e3b4b00a12a31c4c906648a3c7890e82de3550 | |
parent | učenje biologije (diff) | |
download | sola-gimb-3-7f8d80fc2f1eeb9b3c741592ba0062c60642110e.tar sola-gimb-3-7f8d80fc2f1eeb9b3c741592ba0062c60642110e.tar.gz sola-gimb-3-7f8d80fc2f1eeb9b3c741592ba0062c60642110e.tar.bz2 sola-gimb-3-7f8d80fc2f1eeb9b3c741592ba0062c60642110e.tar.lz sola-gimb-3-7f8d80fc2f1eeb9b3c741592ba0062c60642110e.tar.xz sola-gimb-3-7f8d80fc2f1eeb9b3c741592ba0062c60642110e.tar.zst sola-gimb-3-7f8d80fc2f1eeb9b3c741592ba0062c60642110e.zip |
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | fiz/naloga/dokument.tex | 24 | ||||
-rw-r--r-- | geo/Makefile | 2 | ||||
-rw-r--r-- | geo/test3.md | 201 | ||||
-rw-r--r-- | mat/programčki/.gitignore | 2 | ||||
-rw-r--r-- | mat/programčki/ničle.c | 105 | ||||
-rw-r--r-- | mat/programčki/ničle.mutex.c | 105 | ||||
-rw-r--r-- | mat/programčki/ničle.singlethreaded.c | 74 | ||||
-rw-r--r-- | mat/programčki/ničle.singlethreaded16bit.c | 82 | ||||
-rw-r--r-- | mat/programčki/ničle.wannabe-multithreaded.c | 92 |
10 files changed, 686 insertions, 2 deletions
@@ -1,3 +1,4 @@ +.gdb_history *.pdf *.aux *.auxlock diff --git a/fiz/naloga/dokument.tex b/fiz/naloga/dokument.tex index f3ba60e..8ff4153 100644 --- a/fiz/naloga/dokument.tex +++ b/fiz/naloga/dokument.tex @@ -130,8 +130,30 @@ Glavni omejevalni pogoj je žica oziroma električni vodnik, ki bo uporabljen za \end{itemize} % o = n 2 \pi R % R = o/(n2\pi) -Če torej za $n$ vzamemo 150 navojev, bo polmer vsakega navitja $R=\SI{109}{\meter}/(150\cdot2\pi)\widetilde=\SI{11}{\centi\meter}$, jakost homogenega magnetnega polja pa bo ob toku $\SI{0,6}{\ampere}$ (maksimalen tok je $\SI{0,7}{\ampere}$) približno $\SI{7e-6}{\tesla}=\SI{7e-2}{\gauss}$. To je manj od magnetnega polja Zemlje, ki je nekje $\SI{30}{\micro\tesla}=\SI{3e-5}{\tesla}$. +Če torej za $n$ vzamemo 300 navojev, bo polmer vsakega navitja $R=\SI{109}{\meter}/(300\cdot2\pi)\widetilde=\SI{5,8}{\centi\meter}$, jakost homogenega magnetnega polja pa bo ob toku $\SI{0,6}{\ampere}$ (maksimalen tok je $\SI{0,7}{\ampere}$) približno $\SI{2,8}{\milli\tesla}=\SI{28}{\gauss}$. To je več od magnetnega polja Zemlje, ki je nekje $\SI{30}{\micro\tesla}=\SI{3e-5}{\tesla}=\SI{0,3}{\gauss}$. + +Ustrezen merilnik je na primer MPU 9250 podjetja TDK InvenSense, ki poleg gostote magnetnega polja meri tudi pospešek in kotno hitrost v treh razsežnostih. Za tak projekt je idealen, ker ga ne proizvajajo več in je zato cenejši. Sicer točno take integrirane merilnike najdemo tudi v pametnih telefonih, vendar bi bilo s telefonom merjenje težje, saj je v telefonu na neznanem mestu. Podprta hitrost vzorčenja je vse od 8000 do 3,9 vzorcev na sekundo, verjetno bom izvajal okoli 100 meritev na sekundo, torej bom imel za procesiranje vsakega vzorca imel 10 milisekund časa, kar je največ 1,6 milijona ciklov procesorja na \SI{160}{\mega\hertz}. +% https://invensense.tdk.com/download-pdf/invensense-motion-sensor-universal-evaluation-board-uevb-user-guide/ +% https://invensense.tdk.com/wp-content/uploads/2015/02/PS-MPU-9250A-01-v1.1.pdf +\begin{itemize} + \item Žiroskop: 16-bitna ločljivost, merilna območja: + $\SI[parse-numbers=false]{\pm\ang{250}}{\per\second}$, + $\SI[parse-numbers=false]{\pm\ang{500}}{\per\second}$, + $\SI[parse-numbers=false]{\pm\ang{1000}}{\per\second}$ in + $\SI[parse-numbers=false]{\pm\ang{2000}}{\per\second}$. + \item Pospeškomer: 16-bitna ločljivost, merilna območja: + $\pm2g$, + $\pm4g$, + $\pm8g$ in + $\pm16g$. + \item Magnetomer: 14-bitna ločljivost, merilno območje: $\SI{\pm4,8}{\milli\tesla}$. +\end{itemize} +Merilnik nameravam uporabiti za določanje pozicije s stalnim merjenjem podatkov žiroskopa in pospeškometra. V kolikor ti dve komponenti merilnika nista dovolj natančni, bom pozicijo določil z videoanalizo z uporabo knjižnice CCTag. +% http://github.com/alicevision/CCTag + +Za generiranje toka bom uporabil napajalnik računalnika s stalno napetostjo in regulator napetosti. \section{Zaključek} +Bo napisan, ko bom vrednosti praktično tudi izmeril. % https://en.wikipedia.org/wiki/Helmholtz_coil % http://lbm.fe.uni-lj.si/oe/OE2/LabVaja/Priprave%20za%201VAJO%20OE2%20V2.docx % https://en.wikipedia.org/wiki/Biot%E2%80%93Savart_law diff --git a/geo/Makefile b/geo/Makefile index e374d5d..1620f17 100644 --- a/geo/Makefile +++ b/geo/Makefile @@ -1,6 +1,6 @@ SHELL := /bin/bash .PHONY: clean default -default: zse.min.pdf zse.min2.pdf +default: zse.min.pdf zse.min2.pdf test3.min.pdf test3.min2.pdf %.min.pdf: %.pdf pdfjam $< --nup 3x2 --landscape --outfile $@ --no-tidy %.min2.pdf: %.pdf diff --git a/geo/test3.md b/geo/test3.md new file mode 100644 index 0000000..bd363fc --- /dev/null +++ b/geo/test3.md @@ -0,0 +1,201 @@ +# tretji test: srednja evropa in uvod v južno evropo (do in brez portugalske in španije) + +## Prejšnji test: 3. Š: VZHODNA in SREDNJA EVROPA + +* **Kako si od severa proti jugu sledijo sedimentalne kamnine?** + + Proti jugu so mlajše. Na skrajnem severu jih ni, tam je puhlica. + +* **Iz skupine *Poljaki, Lužiški Srbi, Slovaki, Moravci, Čehi in Hrvati* izloči narod, ki vanjo ne sodi.** + + Hrvati. + +* **Kaj je botrovalo nastanku skupnega srednjeevropskega kulturnega prostora?** + + Skupna zgodovina - vsi so bili včasih pod oblastjo Habsburške monarhije in Svetega rimskega cesarstva. + +* **Kakšni nanosti prekrivajo Nemško-Poljsko nižavje?** + + rečni, morski in ledeniški. + +* **Ali ima Avstrija tako kot Švica *zelene vasi*?** + + Ne. + +* **Opiši *žametno revolucijo* na Češkem in Slovaškem!** + + Češka: hitra revolucija, privatizacija podjetij, privabljanje tujcev za vlaganja. Kriza leta 2008 Češke ni prizadela. + Slovaška: poteka počasneje, a vseeno uspe. Do preobrata pride z zmago reformističnih sil na volitvah leta 1998. Privatizirali so podjetja, povečali tuja vlaganja, kriza leta 2008 je ni prizadela. Je pa prišlo do razseljevanja. Avtomobilska industrija, električna in elektronska oprema. + +* **Opiši preobrazbo Gornješlezvijskega industrijskega območja!** + + Modernizirali so ogravanje, kar je zmanjšalo onesnaženost zraka. Zavarovali so nekatera naravna območja. Ustvarili so zelene oaze in številne vodne rezervate. Naredili so posebni prečiščevalni sistem za uravnavanje industrijskih odplak. + +* **Imenuj stare obledeniške doline!** + + Pradoline. + +* **Posledica česa so vinogradi ob reki Ren?** + + Posledica vpliva mediteranskega podnebja. + +* **Opiši pomen baznih predorov v Švici!** + + S tem so preusmerili tovorni promet na železnice in zelo zmanjšali količino izpustov v okolje, saj je zelo manj tovornjakov. Predori so med daljšimi na svetu. + +* **Napiši, kaj se je dogajalo na madžarskem po letu 1991!** TODO + + Modernizacija. Odpravili so sistem iz Sovjetske Zveze. Tam je kmetijstvo zanes zelo pomembno. + +* **Kakšno podnebje prikazuje klimogram, kakšno prst in rastje lahko pričakuješ?** + - **Klimogram: 0 dežja pozimi, 100 mm poleti, -15 °C pozimi, 20 °C poleti** + + kontinentalno vlažno podnebje, rjava in siva prst, mešani gozd (tajga) + +* **Opiši, v čem vse se plansko gospodarstvo razlikuje od tržnega!** + + *povej kaj o kvaliteti, kvantiteti, državi, trgu** + +* **Kaj pomeni kolektivizacija kmetijstva?** + + Nacionalizacija zemlje in uvedba posebnih območij za kmetovanje. Kolhozi so plačani glede na višek, Sorhozi pa so plačani redno. + +* **Opiši ohišnice in napiši, kakšen je pomen ohišnic danes!** + + Ohišnice so edina ohranjena območja privatne zemlje. Velike so do pol hektarja in se nahajajo v bližini naselij družin, ki delajo na Sorhozih in Kolhozih. Tam kmetje pridelujejo hrano zase, za višek dobijo plačo. Za razliko od Sorhozov in Kolhozov si lahko kmetje sami izberejo, kaj bodo sadili. + +* **Imenuj dolino, po kateri poteka ena najpomembnejših vodnih poti Evrope!** + + Doline reke Ren. + +* **Češko-moravska planota je sestavni del neke reliefne oblike, ki smo jo omenjali. Katere? + + Hercinsko sredogorje. + +* **Zakaj so države vzhodnega dela Srednje Evrope (z izjemo Češke) postale v gospodarskem smislu sateliti Sovjetske zveze?** + + Ker so bile manj razvite od zahoda in po drugi svetovni vojni jih je pod svoje okrilje vzela Sovjetska Zveza, od katere so bili politično in gospodarsko odvisni. + +* **Kako je nastala Panonska kotlina?** + + Najprej je bila tam planota, nato je prišlo do tektonskega prelamljanja in zalila jo je voda. Ko je ta voda odtekla, je nastala Panonska kotlina. + +* **Kdaj in zakaj so Saško spremenili v eno najbolj industrializiranih pokrajin sveta? + + Po 2. svetovni vojni, ker so Vzhodni Nemci želeli konkurirati Vzhodni Nemčiji. + +* **Opiši, kaj se je dogajalo na tromeji imenovani *črni trikotnik* in kakšen vpliv je to imelo na ljudi!** + + Tam je bilo veliko industrijsko območje in posledica je bila huda degradacija okolja. Zaradi tega so ljudje zbolevali za hudimi boleznimi, kot na primer rak. + +* **Zakaj se je vzhodnonemško gospodarstvo po združitvi z zahodnonemškim delom v dveh letih začelo sesipati?** + + Zahodni Nemci so bili nezadovoljni, ker so morali plačevati viške davke, da so lahko finančno podprli Vzhodno Nemčijo, Vzhodni Nemci pa zato, ker niso bili navajeni na gospodarstvo in ker je stopnja brezposelnosti padla. Vzhodni Nemci so pričakovali enakopravno združitev, dobili pa so takorekoč privzem s strani *velikega brata*. Konkureca in prosti trg sta Vzhodno Nemčijo kot tehnološki in industrijski vrh tedanjih socialističnih držav hudo prizadela. V korist zahoda je bilo njihovo gospodarstvo uničeno. Izseljevanje, brezposelnost. Wessiji, ossiji. + +## Prejšnji test: 3. C: VZHODNA in SREDNJA EVROPA (2019) + +* **Skiciraj in opiši nastanek pradolin!** + + Reka teče proti Severu (ledenika), nato pa spremeni tok, saj ji nasprotuje čelo ledenika (sedaj teče proti vzhodu). Ko se ledenik umika, reka spet teče proti severu, a mora zopet zaviti, ko naleti nanj. Zaradi njenih nanosov ob ledeniku so nastale doline. + + Ledenik se torej počasi pomika proti vzhodu, reka pa gre prevokotno na njegovo čelo in pušča oddaljene rečne struge. + +* **Kaj se je dogajalo s hercinskimi sredogorji od paleozoika do danes?** TODO + + S časom so se razlamljala in postajala čedalje bolj uravnana. + +* **Kako se je Srednja Evropa razvijala v času *železne zavese*?** + + Srednja Evropa je bila v tistih časih blokovsko razdeljena na kapitalistični zahod, ki se je tržno dobro razvijal po Marshallovem načrtu, in socialistični vzhod, na katerega je močno vplivala Sovjetska Zveza. Še po padcu Berlinskega zidu je vzhod ostal nazadnjaški, a je počasi po številnih kapitalističnih reformah okreval. + +* **Kakšen je bil odziv kmetov na kolektivizacijo kmetijstva?** + + Kmetje so se temu uporali, a so bili te upori neuspešni zaradi prisilnega zatrtja oblasti. + +* **Na kakšen način se je končala blokovska delitev Evrope?** + + S padcem Berlinskega zidu leta 1989. + +* **Ali je gospodarska kriza 2008 prizadela vzhodne države Srednje Evrope bolj ali manj kot države Južne Evrope?** + + Manj. + +* **Napiši pet pokrajinskih tipov Slovenije!** + + Alpski, predalpski, dinarskokraški, obsredozemski in obpanonski. + +## Prejšnji test: 3. B: VZHODNA in SREDNJA EVOPRA (2018) + +* **Opiši reševanje okoljskih težav v Švici in Avstriji!** + + Ustvarjanje baznih predorov oz. prelazov, preusmeritev prometa na železice, posebne takse tovornjake glede na težo in prevožene kilometre, preusmeritev iz množičnega gorskega/alpskega na butični turizem za *turiste z debelimi denarnicami*, v *zelenih vaseh* so prepovedali vožnjo z avtomobili, prepovedali so vožnjo ponoči, med prazniki, ob koncu tedna. + +* **Napiši vse o sanaciji Porurja!** + + Premogovna kriza 1957. Jeklarska kriza 1974. + Začeli so se fokusirati na visoko tehnologijo, univerzitetna središča so postavili, ustvarili so zelene pasove, revirske parke s plavalnimi bazeni, posadili drevesa, uspešno so zmanjšali onesnaževanje zraka in se osredotočili na sektor storitvenih dejavnosti. + +* **Opiši sanacijo Šlezvije!** + + Zaprli so rudnike/premogovnike, zaprli so podjetja, ki so bodisi močno onesnaževala bodisi bila neprofitna. + +## Prejšnji test + +* **Opiši probleme petletk!** + + Rusi so nadzorovali tovarne, konkurence ni bilo, ozirali so se na kvantiteto in ne na kvaliteto. + +* **V kaj je bila usmerjena Sovjetska industrija?** + + V težko industrijo, vojaško industrijo, energetiko. + +## Prejšnji test: VZHODNA in SREDNJA EVROPA (2016) + +* **Severno od katerega vzporednika, označenega na karti, leži večina neurskega dela Evrope? Kaj je za isto geografsko širino značilno v Srednji Evropi?** + + 40°. Nič, saj Srednja Evropa ne leži na istem pasu. + +* **Opiši jezikovno podobo in posebnosti Švice!** + + V Švici so uradni štirje jeziki - francoščina, nemščina, italijanščina in retoromanščina. + Švica je razdeljena na jezikovno samoupravne kantone, zato se morajo prebivalci, ki se preselijo onkraj meja kantona, jezikovno asimilirati. + +## Vprašanja iz učbenika + +### Srednja Evropa in njen geografski okvir + +1. **Katere so štiri najpomembnejše naravne zgradbene enote Srednje Evrope?** + + Nemško-Poljsko nižavje s pradolinami, hercinska sredogorja s kotlinami (Renska dolina), mladonagubani gorovji Alpe na zahodu in zahodni Karpati na vzhodu, Panonska kotlina. + +2. **Zakaj je stepa značilna za Madžarsko, ne pa npr. za severno Nemčijo?** + + Stepa je značilna za najbolj sušne dele, v gorskem svetu Alp in Zahodnih Karpatov pa so se izoblikovali značilni rastlinski višinski pasovi. + +3. **Zakaj so lahko okoljski ministri treh držav učinkovito začrtali program sanacije okolja *črnega trikotnika* šele leta 1991 in ne že deset let prej?** + + Zaradi vpliva Sovjetske zveze na območju tromeje med Vzhodno Nemčijo, Češko in Poljsko. + +### Aktualni geografski procesi in problemi po državah Srednje Evrope + +1. **Kateri so glavni prelazi v Alpah?** +2. **Kateri so po tvojem mnenju glavni vzroki, da zahodna podjetja investirajo v avtomobilsko industrijo v Šleziji, ne pa v Porurju?** +3. **Zakaj je denacionalizacija madžarskega kmetijstva povzročila upad pridelave?** + +### Južna Evropa in njen geografski okvir + +1. **Katere države sestavljajo Južno Evropo?** + + Gospodarsko najrazvitejše: Portugalska, Španija, Italija, Grčija, Malta in Ciper. + +2. **Zakaj je v zahodnem Sredozemlju več padavin kot v vzhodnem?** +3. **Zakaj so bile latifundije bolj ekstenzivno obdelane kot minifundije?** + + Latifundije so bile velika kmetijska posestva fevdalnega izvora. Minifundije pa so majhna samooskrbne kmetije, kmetom je tam primanjkovalo sredstev. Razdrobljenost. + +* litoralizacija: zgoščevanje prebivalstva in gospodarskih dejavnosti na ekološko in prostorsko preobremenjeni obali. +* otoki južne evrope: Balearski otoki, Sardinija, Sicilija, Kreta, Ciper itd. +* polotoki: Iberski, Apeninski, del Balkanskega +* Južna Evropa tektonsko zaradi Afriške in Evrazijske litosferske plošče še vedno aktivna: Etna, Vezuv, Grški otok Santorin, Liparska otoka Vulcano in Stromboli +* mediteranski gozd -> makija -> gariga -> kamnita pušča X-) +* betonske džungle diff --git a/mat/programčki/.gitignore b/mat/programčki/.gitignore new file mode 100644 index 0000000..1442e15 --- /dev/null +++ b/mat/programčki/.gitignore @@ -0,0 +1,2 @@ +*.pgm +*.png diff --git a/mat/programčki/ničle.c b/mat/programčki/ničle.c new file mode 100644 index 0000000..cf453d8 --- /dev/null +++ b/mat/programčki/ničle.c @@ -0,0 +1,105 @@ +#include <stdlib.h> // navdih za to je tedx predstavitev andreja bauerja z naslovom ničle +#include <stdio.h> // to je izris ničel littlewoodovih polinomov +#include <gsl/gsl_poly.h> // prevod: gcc -Wall -Wextra ničle.c -lgsl -lm -pthread +#include <sys/types.h> // program na poti "ime" izdela kvadratno PGM datoteko podane višine +#include <sys/stat.h> // za nadaljno obdelavo je uporabno, če je širina liha; ni pa nujno +#include <fcntl.h> // algoritem se da paralelizirati, ampak jaz imam samo en procesor +#include <sys/mman.h> // enotska krožnica je na četrtini podane širine +#include <string.h> +#include <unistd.h> +#include <gsl/gsl_errno.h> +#include <pthread.h> +struct nit { + int začetek; + int konec; // nit, pomni, da računaš DO konca in konca ne računaš; hvala +}; +void pripravi_koeficiente (double * izhod, int številka) { + while (številka) { + *izhod++ = številka & 1 ? 1 : -1; + številka >>= 1; + } +} +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +_Atomic int izvs = 0, nekonvergiranih = 0, stopnja, ši; +unsigned char * slika; +void * računaj (void * vhod) { + double koeficienti[stopnja+1]; // kako prikladno! polinom nte stopnje ima n+1 členov + double ničle[2*stopnja]; // ima pa n ničer, 2n+0 so realni deli, 2n+1 pa imaginarni + struct nit * nit = (struct nit *) vhod; + gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc(stopnja+1); + for (int i = nit->začetek; i < nit->konec; i++) { + pripravi_koeficiente(koeficienti, i); // noben člen ni 0, vsi so bodisi 1 bodisi -1 + if (gsl_poly_complex_solve(koeficienti, stopnja+1, w, ničle) != GSL_SUCCESS) + nekonvergiranih++; // uuu, lahko bi recimo narisali tiste, ki ne konver. + for (int j = 0; j < 2*stopnja; j += 2) { + int višs = ši/2 - ničle[j+1]*(ši/4); + int širs = ši/2 + ničle[j]*(ši/4); + if (višs > ši || širs > ši || višs < 0 || širs < 0) { + izvs++; + continue; + } + pthread_mutex_lock(&mutex); + slika[2*ši*višs+širs*2+1]++; + if (!slika[2*ši*višs+širs*2+1]) + if (slika[2*ši*višs+širs*2] != 255) + slika[2*ši*višs+širs*2]++; + pthread_mutex_unlock(&mutex); + } + } + gsl_poly_complex_workspace_free(w); + free(nit); return NULL; +} +int main (int argc, char ** argv) { + if (argc != 1+4) { + fprintf(stderr, "takole: %s stopnja ime širina niti\n", argv[0] ? argv[0] : "ničle"); + return 1; + } + int r = 0, kje_začeti = 0, fd, šn = atoi(argv[4]); + stopnja = atoi(argv[1]); + ši = atoi(argv[3]); + pthread_t niti[šn]; + if ((fd = open(argv[2], O_CREAT | O_RDWR, 00664)) == -1) { + perror("open"); + return 2; + } + if (ftruncate(fd, 128 + ši*ši*2) == -1) { + perror("ftruncate"); + if (close(fd) == -1) + perror("close"); + return 3; + } + void * p; + if ((p = mmap(NULL, 128 + ši*ši*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) { + perror("mmap"); + if (close(fd) == -1) + perror("close"); + return 4; + } + slika = (unsigned char *) p + 128; + memset(p, 0, 128 + ši*ši*2); + sprintf(p, "P5\n\n%58d\n%58d\n65535\n", ši, ši); // precisely calculated with dc(1) (: + gsl_set_error_handler_off(); + for (int i = 0; i < šn; i++) { + struct nit * nit = malloc(sizeof(struct nit)); + nit->začetek = kje_začeti; + nit->konec = (kje_začeti += ((1 << (stopnja+1))-1) / šn); + + if ((r = pthread_create(niti+i, NULL, računaj, nit))) { + fprintf(stderr, "pthread_create: %s (%d)\n", strerror(r), r); + r = 5; goto r; + } + } + for (int i = 0; i < šn; i++) { + if ((r = pthread_join(niti[i], NULL))) { + fprintf(stderr, "pthread_join: %s (%d)\n", strerror(r), r); + r = 6; goto r; + } + } +r: + if (munmap(p, 128 + ši*ši*2) == -1) + perror("munmap"); // nima smisla ukinjat programa, sistem si je sam kriv >:) + if (close(fd) == -1) + perror("close"); + printf("%d ničel je izven 2+2i\n%d polinomov ni konvergiralo\n", izvs, nekonvergiranih); + return r; +} diff --git a/mat/programčki/ničle.mutex.c b/mat/programčki/ničle.mutex.c new file mode 100644 index 0000000..cf453d8 --- /dev/null +++ b/mat/programčki/ničle.mutex.c @@ -0,0 +1,105 @@ +#include <stdlib.h> // navdih za to je tedx predstavitev andreja bauerja z naslovom ničle +#include <stdio.h> // to je izris ničel littlewoodovih polinomov +#include <gsl/gsl_poly.h> // prevod: gcc -Wall -Wextra ničle.c -lgsl -lm -pthread +#include <sys/types.h> // program na poti "ime" izdela kvadratno PGM datoteko podane višine +#include <sys/stat.h> // za nadaljno obdelavo je uporabno, če je širina liha; ni pa nujno +#include <fcntl.h> // algoritem se da paralelizirati, ampak jaz imam samo en procesor +#include <sys/mman.h> // enotska krožnica je na četrtini podane širine +#include <string.h> +#include <unistd.h> +#include <gsl/gsl_errno.h> +#include <pthread.h> +struct nit { + int začetek; + int konec; // nit, pomni, da računaš DO konca in konca ne računaš; hvala +}; +void pripravi_koeficiente (double * izhod, int številka) { + while (številka) { + *izhod++ = številka & 1 ? 1 : -1; + številka >>= 1; + } +} +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +_Atomic int izvs = 0, nekonvergiranih = 0, stopnja, ši; +unsigned char * slika; +void * računaj (void * vhod) { + double koeficienti[stopnja+1]; // kako prikladno! polinom nte stopnje ima n+1 členov + double ničle[2*stopnja]; // ima pa n ničer, 2n+0 so realni deli, 2n+1 pa imaginarni + struct nit * nit = (struct nit *) vhod; + gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc(stopnja+1); + for (int i = nit->začetek; i < nit->konec; i++) { + pripravi_koeficiente(koeficienti, i); // noben člen ni 0, vsi so bodisi 1 bodisi -1 + if (gsl_poly_complex_solve(koeficienti, stopnja+1, w, ničle) != GSL_SUCCESS) + nekonvergiranih++; // uuu, lahko bi recimo narisali tiste, ki ne konver. + for (int j = 0; j < 2*stopnja; j += 2) { + int višs = ši/2 - ničle[j+1]*(ši/4); + int širs = ši/2 + ničle[j]*(ši/4); + if (višs > ši || širs > ši || višs < 0 || širs < 0) { + izvs++; + continue; + } + pthread_mutex_lock(&mutex); + slika[2*ši*višs+širs*2+1]++; + if (!slika[2*ši*višs+širs*2+1]) + if (slika[2*ši*višs+širs*2] != 255) + slika[2*ši*višs+širs*2]++; + pthread_mutex_unlock(&mutex); + } + } + gsl_poly_complex_workspace_free(w); + free(nit); return NULL; +} +int main (int argc, char ** argv) { + if (argc != 1+4) { + fprintf(stderr, "takole: %s stopnja ime širina niti\n", argv[0] ? argv[0] : "ničle"); + return 1; + } + int r = 0, kje_začeti = 0, fd, šn = atoi(argv[4]); + stopnja = atoi(argv[1]); + ši = atoi(argv[3]); + pthread_t niti[šn]; + if ((fd = open(argv[2], O_CREAT | O_RDWR, 00664)) == -1) { + perror("open"); + return 2; + } + if (ftruncate(fd, 128 + ši*ši*2) == -1) { + perror("ftruncate"); + if (close(fd) == -1) + perror("close"); + return 3; + } + void * p; + if ((p = mmap(NULL, 128 + ši*ši*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) { + perror("mmap"); + if (close(fd) == -1) + perror("close"); + return 4; + } + slika = (unsigned char *) p + 128; + memset(p, 0, 128 + ši*ši*2); + sprintf(p, "P5\n\n%58d\n%58d\n65535\n", ši, ši); // precisely calculated with dc(1) (: + gsl_set_error_handler_off(); + for (int i = 0; i < šn; i++) { + struct nit * nit = malloc(sizeof(struct nit)); + nit->začetek = kje_začeti; + nit->konec = (kje_začeti += ((1 << (stopnja+1))-1) / šn); + + if ((r = pthread_create(niti+i, NULL, računaj, nit))) { + fprintf(stderr, "pthread_create: %s (%d)\n", strerror(r), r); + r = 5; goto r; + } + } + for (int i = 0; i < šn; i++) { + if ((r = pthread_join(niti[i], NULL))) { + fprintf(stderr, "pthread_join: %s (%d)\n", strerror(r), r); + r = 6; goto r; + } + } +r: + if (munmap(p, 128 + ši*ši*2) == -1) + perror("munmap"); // nima smisla ukinjat programa, sistem si je sam kriv >:) + if (close(fd) == -1) + perror("close"); + printf("%d ničel je izven 2+2i\n%d polinomov ni konvergiralo\n", izvs, nekonvergiranih); + return r; +} diff --git a/mat/programčki/ničle.singlethreaded.c b/mat/programčki/ničle.singlethreaded.c new file mode 100644 index 0000000..d2d1e0c --- /dev/null +++ b/mat/programčki/ničle.singlethreaded.c @@ -0,0 +1,74 @@ +#include <stdlib.h> // navdih za to je tedx predstavitev andreja bauerja z naslovom ničle +#include <stdio.h> // to je izris ničel littlewoodovih polinomov v manj kot 105 vrsticah +#include <gsl/gsl_poly.h> // prevod: gcc -Wall -Wextra -pedantic -lgsl -lm ničle.c +#include <sys/types.h> // program na poti "ime" izdela kvadratno PGM datoteko podane višine +#include <sys/stat.h> // za nadaljno obdelavo je uporabno, če je širina liha; ni pa nujno +#include <fcntl.h> // algoritem se da paralelizirati, ampak jaz imam samo en procesor +#include <sys/mman.h> // enotska krožnica je na četrtini podane širine +#include <string.h> +#include <unistd.h> +#include <gsl/gsl_errno.h> +void pripravi_koeficiente (double * izhod, int številka) { + while (številka) { + *izhod++ = številka & 1 ? 1 : -1; + številka >>= 1; + } +} +int main (int argc, char ** argv) { + int izven_slike = 0; + int nekonvergiranih = 0; + if (argc != 1+3) { + fprintf(stderr, "uporaba: %s stopnja ime širina\n", argv[0] ? argv[0] : "ničle"); + return 1; + } + int šir = atoi(argv[3]); + int fd; + if ((fd = open(argv[2], O_CREAT | O_RDWR, 00664)) == -1) { + perror("open"); + return 2; + } + if (ftruncate(fd, 128 + šir*šir) == -1) { + perror("ftruncate"); + if (close(fd) == -1) + perror("close"); + return 3; + } + void * p; + if ((p = mmap(NULL, 128 + šir*šir, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) { + perror("mmap"); + if (close(fd) == -1) + perror("close"); + return 4; + } + unsigned char * slika = (unsigned char *) p + 128; + memset(p, 0, 128 + šir*šir); + sprintf(p, "P5\n\n%59d\n%59d\n255\n", šir, šir); // precisely calculated with dc(1) (: + int stopnja = atoi(argv[1]); + double koeficienti[stopnja+1]; // kako prikladno! polinom nte stopnje ima n+1 členov + double ničle[2*stopnja]; // ima pa n ničer, 2n+0 so realni deli, 2n+1 pa imaginarni + gsl_set_error_handler_off(); + gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc(stopnja+1); + for (int i = 0; i < 1 << (stopnja+1); i++) { + pripravi_koeficiente(koeficienti, i); // noben člen ni 0, vsi so bodisi 1 bodisi -1 + if (gsl_poly_complex_solve(koeficienti, stopnja+1, w, ničle) != GSL_SUCCESS) + nekonvergiranih++; // uuu, lahko bi recimo narisali tiste, ki ne konver. + for (int j = 0; j < 2*stopnja; j += 2) { + int višina_na_sliki = šir/2 - ničle[j+1]*(šir/4); + int širina_na_sliki = šir/2 + ničle[j]*(šir/4); + if (višina_na_sliki > šir || širina_na_sliki > šir + || višina_na_sliki < 0 || širina_na_sliki < 0) { + izven_slike++; + continue; + } + slika[šir*višina_na_sliki+širina_na_sliki]++; + } + } + gsl_poly_complex_workspace_free(w); + if (munmap(p, 128 + šir*šir) == -1) + perror("munmap"); // nima smisla ukinjat programa, sistem si je sam kriv >:) + if (close(fd) == -1) + perror("close"); + printf("%d ničel je izven 2+2i (izven slike)\n%d polinomov ni konvergiralo\n", + izven_slike, nekonvergiranih); + return 0; +} diff --git a/mat/programčki/ničle.singlethreaded16bit.c b/mat/programčki/ničle.singlethreaded16bit.c new file mode 100644 index 0000000..2412a1a --- /dev/null +++ b/mat/programčki/ničle.singlethreaded16bit.c @@ -0,0 +1,82 @@ +#include <stdlib.h> // navdih za to je tedx predstavitev andreja bauerja z naslovom ničle +#include <stdio.h> // to je izris ničel littlewoodovih polinomov v manj kot 105 vrsticah +#include <gsl/gsl_poly.h> // prevod: gcc -Wall -Wextra -pedantic -lgsl -lm ničle.c +#include <sys/types.h> // program na poti "ime" izdela kvadratno PGM datoteko podane višine +#include <sys/stat.h> // za nadaljno obdelavo je uporabno, če je širina liha; ni pa nujno +#include <fcntl.h> // algoritem se da paralelizirati, ampak jaz imam samo en procesor +#include <sys/mman.h> // enotska krožnica je na četrtini podane širine +#include <string.h> +#include <unistd.h> +#include <gsl/gsl_errno.h> +void pripravi_koeficiente (double * izhod, int številka) { + while (številka) { + *izhod++ = številka & 1 ? 1 : -1; + številka >>= 1; + } +} +int main (int argc, char ** argv) { + int izven_slike = 0; + int nekonvergiranih = 0; + if (argc != 1+3) { + fprintf(stderr, "uporaba: %s stopnja ime širina\n", argv[0] ? argv[0] : "ničle"); + return 1; + } + int šir = atoi(argv[3]); + int fd; + if ((fd = open(argv[2], O_CREAT | O_RDWR, 00664)) == -1) { + perror("open"); + return 2; + } + if (ftruncate(fd, 128 + šir*šir*2) == -1) { + perror("ftruncate"); + if (close(fd) == -1) + perror("close"); + return 3; + } + void * p; + if ((p = mmap(NULL, 128+šir*šir*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) { + perror("mmap"); + if (close(fd) == -1) + perror("close"); + return 4; + } + unsigned char * slika = (unsigned char *) p + 128; + memset(p, 0, 128 + šir*šir*2); + sprintf(p, "P5\n\n%58d\n%58d\n65535\n", šir, šir); // precisely calculated with dc(1) (: + int stopnja = atoi(argv[1]); + double koeficienti[stopnja+1]; // kako prikladno! polinom nte stopnje ima n+1 členov + double ničle[2*stopnja]; // ima pa n ničer, 2n+0 so realni deli, 2n+1 pa imaginarni + gsl_set_error_handler_off(); + gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc(stopnja+1); + int prej_izpisano = 6969; + for (int i = 0; i < 1 << (stopnja+1); i++) { + if (prej_izpisano != i*1000/(1 << (stopnja+1))) { + prej_izpisano = i*1000/(1 << (stopnja+1)); + fprintf(stderr, "\rRačunam in rišem ničle: %d promilov", prej_izpisano); + } + pripravi_koeficiente(koeficienti, i); // noben člen ni 0, vsi so bodisi 1 bodisi -1 + if (gsl_poly_complex_solve(koeficienti, stopnja+1, w, ničle) != GSL_SUCCESS) + nekonvergiranih++; // uuu, lahko bi recimo narisali tiste, ki ne konver. + for (int j = 0; j < 2*stopnja; j += 2) { + int višina_na_sliki = šir/2 - ničle[j+1]*(šir/4); + int širina_na_sliki = šir/2 + ničle[j]*(šir/4); + if (višina_na_sliki > šir || širina_na_sliki > šir + || višina_na_sliki < 0 || širina_na_sliki < 0) { + izven_slike++; + continue; + } + slika[2*šir*višina_na_sliki+širina_na_sliki*2+1]++; + if (!slika[1*šir*višina_na_sliki+širina_na_sliki*2+1]) + slika[2*šir*višina_na_sliki+širina_na_sliki*2]++; + } + } + fprintf(stderr, "\r KONČANO \n"); + gsl_poly_complex_workspace_free(w); + if (munmap(p, 128 + šir*šir) == -1) + perror("munmap"); // nima smisla ukinjat programa, sistem si je sam kriv >:) + if (close(fd) == -1) + perror("close"); + printf("%d ničel je izven 2+2i (izven slike)\n%d polinomov ni konvergiralo\n", + izven_slike, nekonvergiranih); + return 0; +} diff --git a/mat/programčki/ničle.wannabe-multithreaded.c b/mat/programčki/ničle.wannabe-multithreaded.c new file mode 100644 index 0000000..66954be --- /dev/null +++ b/mat/programčki/ničle.wannabe-multithreaded.c @@ -0,0 +1,92 @@ +#include <stdlib.h> // navdih za to je tedx predstavitev andreja bauerja z naslovom ničle +#include <stdio.h> // to je izris ničel littlewoodovih polinomov +#include <gsl/gsl_poly.h> // prevod: gcc -Wall -Wextra ničle.c -lgsl -lm -pthread +#include <pthread.h> // program na poti "ime" izdela kvadratno PGM datoteko podane višine +#include <gsl/gsl_errno.h> // za nadaljno obdelavo je uporabno, če je širina liha; ni pa nujno +#include <string.h> // algoritem se da paralelizirati, ampak jaz imam samo en procesor +struct nit { // enotska krožnica je na četrtini podane širine + int začetek; + int konec; // nit, pomni, da računaš DO konca in konca ne računaš; hvala + unsigned int * platno; + pthread_t nit; + int stopnja; + int širina; +}; +void pripravi_koeficiente (double * izhod, int številka) { + while (številka) { + *izhod++ = številka & 1 ? 1 : -1; + številka >>= 1; + } +} +_Atomic unsigned long long int izvs = 0, nekonv = 0; +void * računaj (void * vhod) { + struct nit * nit = (struct nit *) vhod; + double koeficienti[nit->stopnja+1]; // kako prikladno! polinom nte stopnje ima n+1 členov + double ničle[2*nit->stopnja]; // ima pa n ničel, 2n so realni deli, 2n+1 pa imagin. + gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc(nit->stopnja+1); + for (int i = nit->začetek; i < nit->konec; i++) { + pripravi_koeficiente(koeficienti, i); // noben člen ni 0, vsi so bodisi 1 bodisi -1 + if (gsl_poly_complex_solve(koeficienti, nit->stopnja+1, w, ničle) != GSL_SUCCESS) + nekonv++; // uuu, lahko bi recimo narisali tiste, ki ne konver. + for (int j = 0; j < 2*nit->stopnja; j += 2) { + int višs = nit->širina/2 - ničle[j+1]*(nit->širina/4); + int širs = nit->širina/2 + ničle[j]*(nit->širina/4); + if (višs > nit->širina || širs > nit->širina || višs < 0 || širs < 0) { + izvs++; + continue; + } + nit->platno[nit->širina*višs+širs]++; + } + } + gsl_poly_complex_workspace_free(w); + return NULL; +} +int main (int argc, char ** argv) { + if (argc != 1+3) { + fprintf(stderr, "takole: %s stopnja širina niti\n", argv[0] ? argv[0] : "ničle"); + return 1; + } + int r = 0, zač = 0, stopnja = atoi(argv[1]), širina = atoi(argv[2]), šn = atoi(argv[3]); + gsl_set_error_handler_off(); + struct nit niti[šn]; + for (int i = 0; i < šn; i++) { + niti[i].začetek = zač; + niti[i].konec = (zač += ((1 << (stopnja+1))-1) / šn); + niti[i].stopnja = stopnja; + niti[i].širina = širina; + if (!(niti[i].platno = malloc(sizeof(*niti[i].platno)*širina*širina))) { + fprintf(stderr, "premalo delovnega spomina\n"); + return 2; + } + if ((r = pthread_create(&niti[i].nit, NULL, računaj, &niti[i]))) { + fprintf(stderr, "pthread_create: %s (%d)\n", strerror(r), r); + return 3; + } + } + for (int i = 0; i < šn; i++) { + if ((r = pthread_join(niti[i].nit, NULL))) { + fprintf(stderr, "pthread_join: %s (%d)\n", strerror(r), r); + return 4; + } + } + printf("P5 %d %d 256\n", širina, širina); + unsigned long long int over = 0; + for (int i = 0; i < širina*širina; i++) { + unsigned long long int sešt = 0; + for (int j = 0; j < šn; j++) + sešt += niti[j].platno[i]; + if (sešt > 65535) { + fputc(0xFF, stdout); + over++; + continue; + } + fputc(sešt >> 8, stdout); + fputc(sešt % 256, stdout); + } + for (int i = 0; i < šn; i++) { + free(niti[i].platno); + } + fprintf(stderr, "%llu ničel je izven 2+2i (izven slike)\n%llu polinomov ni konvergiralo\n" + "%llu vrednosti na sliki je preseglo najv. vrednost\n", izvs, nekonv, over); + return 0; +} |