ALGORITHMEN - Teil XV : Das Müllen ist des Wandrers Lust

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Abt. Matrixmultiplikation via Proc
      ========================
      Als Vorbereitung zur allfällligen Beschleunigung mittels des kommenden X4-Assemblers (XASM).
      Gruss

      Quellcode

      1. Windowtitle "MATMUL - Matrixmultiplikation als Proc"
      2. Windowstyle 24
      3. Window 0,0-%maxx,%maxy:print
      4. Declare s&,sz&,z&,err&
      5. 'z&=53 : sz&=50 : s&=17
      6. z&=53 : sz&=1 : s&=10
      7. set("decimals",0):set("numwidth",8)
      8. dec z&:dec sz&:dec s&
      9. Declare u![z&,sz&],v![sz&,s&],w![z&,s&]
      10. inc z&:inc sz&:inc s&
      11. u![]=&index : v![]=3*&index
      12. Check MATMUL(u![],v![],w![],s&,sz&,z&)
      13. font 2
      14. Check MATPRNT(w![],s&,z&)
      15. waitinput
      16. END
      17. Proc MATMUL :parameters a![],b![],c![],s&,sz&,z&
      18. case (s&<1) or (sz&<1) or (s&<1):return -2
      19. case (s&*sz&*z&)>50000:return -1
      20. Declare sum!,prod!,i&,j&,k&
      21. dec s&:dec sz&:dec z&
      22. Whileloop 0,z&:i&=&Loop
      23. whileloop 0,s&:j&=&Loop
      24. sum!=0
      25. whileloop 0,sz&:k&=&Loop
      26. prod!=a![i&,k&]*b![k&,j&]
      27. sum!=sum!+prod!
      28. EndWhile
      29. c![i&,j&]=sum!
      30. EndWhile
      31. EndWhile
      32. return 0
      33. EndProc
      34. Proc MATPRNT
      35. parameters c![],s&,z&
      36. case (s&<1) or (s&<1):return -2
      37. case (s&*z&)>50000:return -3
      38. case (z&>53) or (s&>17):return -4
      39. declare i&,j&
      40. dec s&:dec z&
      41. Whileloop 0,z&:i&=&Loop
      42. whileloop 0,s&:j&=&Loop
      43. print c![i&,j&],
      44. EndWhile:print
      45. EndWhile
      46. return 0
      47. EndProc
      48. proc Check:parameters err&
      49. select err&
      50. caseof 0:return
      51. caseof -1:Print " Error: *** Index Overflow ***"
      52. caseof -2:Print " Error: *** Index <=0 ***"
      53. caseof -3:Print " Error: *** Mat too big for RAM ***"
      54. caseof -4:Print " Problem: *** Mat too big for Screen ***"
      55. otherwise :Print " Error: *** unknown ***"
      56. endselect
      57. endproc
      Alles anzeigen
    • Abt. Wussten Sie schon...
      -----------------------------
      Bei einer brennenden 60-Watt-Glühbirne (Lichtwirkungsgrad ca. 10%) werden pro Sekunde 10´000´000´000´000´000 sichtbare Photonen in alle Richtungen geschleudert, und zwar mit Lichtgeschwingigkeit, weil alle masselosen Teilchen sich mit Lichtgeschwindigkeit bewegen (bewegen müssen).

      Die Energie eines solchen "Licht-Elementarteilchens" errechnet sich aus E = h * f , wobei h das Planck´sche Wirkungsquantum (6.626*10^-34 Joulesekunden [J.s]) darstellt und die Frequenz f (Wellenzüge pro Sekunde) sich aus der Wellenlänge Lambda [m] des für das menschliche Auge sichtbaren Lichts (blau: 380 nm, rot: ca. 780 nm) errechnet nach f [Hz] = c * 1/Lambda [m] mit der konstanten Lichtgeschwindigkeit in Luft (oder Vakuum) c = 299´792´458 [m/s].

      Kuckst Du, was?

      P.S.: Wie man von Astronauten weiß, kann das menschliche Auge bis herunter zu 9 Photonen je 100 ms als (flackernde) Lichtquelle erkennen. Frösche können einzelne Photonen sehen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • Abt. Das INTEL/AMD Hardware-Sicherheitsproblem
      =================================
      "Wenn Du wissen willst,, wo deine Fehler liegen: Frag deine ehemaligen Feinde!"

      LINK: Youtube-Vortrag (engl.) von Joanna Rutkowska am 32C3-Konvent des Chaos Computer Clubs

      Wiki über die Vortragende

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • Abt. Spectre und Meltdown
      ===================
      sind Angriffe auf die Branch Prediction Hardware und die "spekulative Vosrausberechnung" häufig genommener Maschinenprogramm-Abläufe. Das scheiint sogar aus Javascript heraus über das Internet zu klappen - Riesenproblem für Intel und AMD.
      Normalerweise sollten sämtliche Prozessorzustände beim Verwerfen einer "Fehlspekulation" wieder in den Ausgangszustand zurückversetzt werden. Das ist bei Intel X86-Technologie aber nicht ganz der Fall, und dadurch ergeben sich Grenzüberschreitungen zu als abgesichert geglaubten Speicherstellen. Ein Angreifer, der das ausnutzt, kann so zum Beispiel den Browser-Passwordbereich auslesen. Auch Internetbanking ist dadurch gefährdet.

      Quellcode

      1. //Der Angriff funktioniert theoretisch wie folgt:
      2. unsigned int array1_size = 16;
      3. uint8_t array1[16] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
      4. uint8_t array2[256 * 512];
      5. uint8_t temp;
      6. void victim_function(size_t x) {
      7. if (x < array1_size) { //Vergleich wird für die fehlerhafte Sprungvorhersage ausgenutzt
      8. temp &= array2[array1[x] * 512];
      9. // Der Zugriff auf array2[] lädt eine Seite in den Cache, deren Adresse
      10. // vom Inhalt von array1[x] abhängt. Das ist der verdeckte Kanal.
      11. }
      12. }
      Alles anzeigen
      Die verzweifelt wirkenden Korrekturversuche von Intel per Update führen bei Win-10 Systemen zu einer spürbaren Verlangsamung. Auch sind bei bestimten CPU-Technologien spontane Neustarts nach dem Update zu bemerken. Intel und AMD wissen das seit 1. Juni 2017, am 3. 1. 2018 wurde der damals gefundene Bug nun auch in der breiten Öffentlichkeit bekannt. Lt. Spezialisten hilft dabei entweder Austausch der gesamtenn CPU, oder zumindest eine nachträgliche Änderung des Microcodes der CPU per BIOS-Patch (so wie damals beim Pentium-Rechenfehler).
      Gruss

      P.S.: Die Meltdown-Sicherheitslücke bedient sich ebenfalls der "Spekulativen Ausführung", ist aber nicht ganz so weitreichend wie die Spectre-Lücke. AMD-Prozessoren sind von Meltdown z.B. nicht betroffen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • Abt. Zahlen mit Teilervorgabe
      ===============================
      Es gibt Zahlen, die auffällig viele ganzzahlige Teiler haben. Beispiele sind 12 (4 nichttriviale Teiler: 2,3,4,6) oder 60 (10 Teiler: 2,3,4,5,6,10,12,15,20,30) oder 360 (22 Teiler: 2,3,4,5,6,8,9,10,12,15,18,20,24,30,36,40,45,60,72,90,120,180). Auf dieser Eigenschaft beruhten bereits in grauer Vorzeit ganze Kalender- und Einheitensysteme.

      Quellcode

      1. WindowTitle "Teiler bestimmen und zählen"
      2. windowstyle 24:cls:font 2:clearclip:declare Zahl&,n&
      3. print "\n Zu untersuchende Zahl?: ";:input Zahl&
      4. n&=0:print "\n Die Teiler von ";Zahl&;" sind:\n ";
      5. whileloop 2,Zahl&\2
      6. ifnot Zahl& mod &Loop:print &Loop,:inc n&
      7. putclip str$(&Loop)+",":endif
      8. endwhile
      9. print "\n ... also ";n&;" Teiler."
      10. case n&:print " (in Zwischenablage)"
      11. waitinput
      Alles anzeigen
      UMGEKEHRT GILT: Gibt man die Teiler vor, kann man auch die zugehörige Zahl suchen, die diese Teiler hat (Also das Kleinste gemeinsame Vielfache dieser teilenden Faktoren): Bei Vorgabe von 2,3,4 und 6 ergibt das dann 12.

      Berechnen lässt sich dieses Kleinste gemeinsame Vielfache kgV beispielsweise über den Größten gemeinsamen Teiler ggT (sh. "Euklidischer Algorithmus"): Der kgV aller Faktoren der gesuchten Zahl ergibt sich als Produkt dieser Faktoren dividiert durch allderen paarweise ggT.

      Nach einem anderen System gefunden wurde nun jüngst jene Zahl, die alle Zahlen von 1 bis 100 als Teiler hat. Diese Zahl hat 41 Stellen und lautet: 69´720´375´229´712´477´164´533´808´935´312´303´556´800

      Gruss

      P.S.: Gefunden in einem Matheboard

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von p. specht ()

    • Abt. Weitere Rätsel WR 15: Das Geheimwort
      ----------------------------------------------
      Der Englischlehrer schreibt 6 kurze Worte an die Tafel:

      has, max, dim, tag, cat, dog

      Dann wählt er geheim eines dieser Worte aus und schreibt auf drei verschiedene Zettel je einen Buchstaben
      dieses Wortes. Die Zettel verteilt er an Alf, Bert und Carla.

      Anschließen fragt er: "Alf, kennst du das Wort?"
      Alf antwortet laut: "Ja, ich weiß es!"

      Da meint Bert: "Hmmmm..., ich auch!"

      Da sagt auch Carla nach kurzem Nachdenken: "Ach so? Dann ist alles klar!"

      Frage: Wie lautet das geheime Wort?
    • Lösung zu WR 15:
      Spoiler anzeigen

      has, max, dim, tag, cat, dog
      Das sind 6 Worte mit 18 Buchstaben, davon 11 unterschiedliche:

      a:4 c:1 d:2 g:2 h:1 i:1 m:2 o:1 s:1 t:2 x:1

      "Alf: Ich weiß es!" bedeutet, Alf hat einen Buchstaben der nur 1x vorkommt. So kann er genau sein Wort identifizieren! Es kann sich also nur um folgende Worte handeln:

      cat dog has max dim tag
      c__ _o_ h_s __x _i_ ___

      "Bert: Hmmmm... ha, ich weiß es auch!" bedeutet: Bert hat ein Wort mit 2x einzigartig identifiziert:

      cat dog has max dim tag
      ___ ___ h_s ___ ___ ___

      Also steht "has" nun schon fest.
      "Carla: Ach so ist das.. dann weiß ich es auch!" bedeutet: Nun ist es eindeutig!

      Lösung daher: "has" war das gesuchte Wort!
    • Abt. Intellligenz nach Ländern
      ======================
      Was Intelligenz überhaupt ist, da streiten sich die Experten. Über 20 bekannte Definitionen reichen von "Erfahrungen auf neue Situationen anwenden können" bis "Intelligenz ist das was Intelligenztests messen" (Imho klingt letztere Definition eher grenzdebil).

      Abseits dieses Streits gibt es Indikatoren wie Staatlicher Bildungsaufwand, Entwicklungsstand, Lebensqualitäts-Indikatoren, Kriminalitätsrate etc, die man statistisch signifikant zu einer Art Länder-IQ verdichten kann - ohne daraus allzu viele Schlüsse ziehen zu können - Denn es gilt immer noch: Andere Länder, andere Sitten - andere Lebenssituationen.

      Hier (LINK) hat man versucht, ein Länder-Ranking durchzuführen, das Länder-IQ genannt wird. Da flossen die Meinungen von Bildungsexperten aus aller Welt ein, und sicher auch ein paar Vorurteile. Es kann sich also nur um eine sehr grobe Einschätzung handeln. Interessant erscheint das Thema allemal...
      Gruss
    • Abt. Fehleingaben von Konstanten via DEF
      ------------------------------------------------
      (Anlaß: Lange Fehlersuche wegen eingeschlichenem Zeichen ´A´)

      Quellcode

      1. Cls:set("decimals",17):font 2
      2. def !u 01
      3. def !v 1.
      4. def !w 1.1
      5. def !x 1.1,
      6. def !y 1.1 A
      7. def !z 1.1e4
      8. def !zz 1.1e-4
      9. print "\n def !u 01 '>>> ";!u;" ... OK"
      10. print "\n def !v 1. '>>> ";!v;" ... OK"
      11. print "\n def !w 1.1 '>>> ";!w;" ... OK"
      12. print "\n def !x 1.1, '>>> ";!x;" ... HUCH!"
      13. print "\n def !y 1.1 A '>>> ";!y;" ... WAS??"
      14. print "\n def !z 1.1e4 '>>> ";!z;" ... OK"
      15. print "\n def !zz 1.1e-4 '>>> ";!zz;" ... OK"
      16. waitinput
      Alles anzeigen
    • Abt. WorkAreaWindow
      ==============
      Wenn man nicht Gefahr laufen will, beim Anlegen eines Arbeitsfensters den gesamten Desktop des Users einzunehmen und damit Taskleisten und Steuerflächen zuzudecken, dann sollte man vorher die Lage und Größe der verfügbaren Arbeitsfläche abfragen.
      Gruss

      Quellcode

      1. Begin:
      2. Declare wax&,way&, wah&,wab&
      3. CreateWorkAreaWindow("WorkArea Window",24)
      4. print "\n",wax&,way&,"-",wah&,wab&
      5. WaitInput
      6. End
      7. Proc CreateWorkAreaWindow
      8. parameters WinTitle$,WinStyle&
      9. Declare Rect#:Dim Rect#,16
      10. WindowTitle WinTitle$:Windowstyle WinStyle&
      11. DEF SysParameterInfo(4)!"user32","SystemParametersInfoA"
      12. SysParameterInfo(48,0,Rect#,0)
      13. wax&=Long(Rect#,0)
      14. way&=Long(Rect#,4)
      15. wah&=Long(Rect#,8)
      16. wab&=Long(Rect#,12)
      17. Dispose Rect#
      18. Window wax&,way&-wah&,wab&
      19. EndProc
      Alles anzeigen
    • Abt. Klar, was passiert?
      -----------------------

      Quellcode

      1. Cls
      2. Def $EFG "Helles Bier"
      3. print $EFG
      4. Def $ABC "Dunkles Bier"
      5. print $ABC
      6. waitinput
      DEF klappt bei String übrigens auch ohne Anführungszeichen, solange ! nur am Ende vorkommt:

      Quellcode

      1. Cls
      2. Def $EFG Helles Bier ist mir lieber als Dunkles!
      3. print substr$($EFG,7," ")
      4. waitinput

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von p. specht ()

    • Beim ersten Code weiß halt der Interpreter nicht, ob
      er die Hexadezimalzahl oder den String ausdrucken soll.
      Da hat Roland sich wohl richtigerweise für ersteres
      entschieden.
      Besser wäre damals gewesen, nicht das $ - Zeichen
      zu nehmen, sondern ein anderes. Notfalls, wie auch in
      C, C++ usw. üblich das "0x".

      Zweiter Code läuft bei mir richtig.
      7. Teilstring = Dunkles!

      Ja, jetzt könnte man sich wieder streiten, warum bei
      Arrays und Listen usw. bei 0 angefangen wird und
      bei Substr$() bei 1. Ich finde es aber so, wie es ist
      einfach logischer.
    • Neu

      Abt. Weitere Rätsel WR 16: "Vorsicht Baum!"
      ==============================
      Auf einer Landstraße sind 100 km/h erlaubt. Wie immer gibt es aber auch Raser, die meinen, sich wie auf der Autobahn benehmen zu müssen - die fahren dann z.B. 140 km/h. In jenem Augenblick, als mich (100 km/h) so ein Raser (140 km/h) gerade überholte, bemerkten er und ich hinter der leichten Fahrbahnkuppe gleichzeitig einen großen Baum quer über die Straße liegen. Ich bremste sofort stark und konnte meinen Wagen ganz knapp vor dem Baum zum stehen bringen. Frage: Mit welcher Geschwindigkeit kollidierte der Raser (Er fuhr den selben Fahrzeugtyp wie ich) mit dem Baum?
      Gruss

      P.S.: Gleiches Fahrzeuggewicht, gleiche Bremsleistung. Ich konnte meine Kinetische Energie E_kin = m/2*v^2 ganz abbauen, er diese ebenfalls, was für ihn aber nicht genug war...
    • Neu

      Lösung zu WR 16 Baum:
      Spoiler anzeigen

      Kinetische Energie, die ich beim abbremsen auf Null brachte:
      E_kin = m/2*v^2 = m/2*(100)^2
      Kinetische Energie, die der Raser bei gleicher Bremsleistung hätte vernichten müssen:
      E_Raser = m/2*(140)^2 ... Verhältnis: Ich 10000, Raser 19600 !!!

      D.h.: Bei gleicher Bremsleistung kam ich zum stehen - da hatte der Raser noch eine Energie drauf von
      E_Raser = m/2 * 9600 .
      Wegen E_kin = m/2* (97.9796 km/h)^2 prallte er also mit ca. 98 km/h an den Baum.
      Viel blieb nicht über von ihm ...
    • Neu

      Lösung zu WR 17:

      Spoiler anzeigen
      Selbst ausgebufften Mathematikern ist noch kein sicheres formelmäßiges Verfahren eingefallen um die Frage der ersten Primzahllücke bestimmter Länge allgemein zu lösen. Allerdings haben Bemühungen in diese Richtung dem Vernehmen nach zum Beweis (noch nicht gämzlich geprüft) der sog. ABC-Vermutung geführt, einem Problem ähnlich schwer wie die (durch Andrew Wiles bewiesene) "Fermatsche Vermutung". Momentan bleibt also nur Ausprobieren: Wir suchen die Primzahllücke 6 ( = mathem. Zählweise), und der begegnen wir erstmals zwischen 23 (24 25 26 27 28) und 29.