{"id":6,"date":"2010-01-03T18:00:47","date_gmt":"2010-01-03T16:00:47","guid":{"rendered":"http:\/\/www.anginf.de\/?p=6"},"modified":"2014-07-10T17:15:46","modified_gmt":"2014-07-10T15:15:46","slug":"gmp-wrapper-fuer-vb-net","status":"publish","type":"post","link":"https:\/\/www.anginf.de\/?p=6","title":{"rendered":"GMP Wrapper f\u00fcr VB.NET"},"content":{"rendered":"<p>Bei einem meiner Hobbys, <a href=\"http:\/\/projecteuler.net\/\">ProjectEuler<\/a> versucht man mathematische Probleme mithilfe der Programmierung zu l\u00f6sen. Dabei greifen viele der dort registrierten Anwender auf professionelle Mathematik-Programme (Mathematica, etc.) zur\u00fcck.<\/p>\n<p>Ich finde es aber deutlich interessanter, die Probleme selbst zu analysieren und die erzeugten Programmschleifen immer wieder ein wenig zu verfeinern und zu verbessern, bis man innerhalb der geforderten 60 Sekunden auch das korrekte Ergebnis ausgespuckt bekommt.<\/p>\n<p>Als Programmiersprache habe ich mir VB.NET ausgesucht, was gerade f\u00fcr mathematische Probleme oft unn\u00f6tig Barrieren bereitstellt. So sind Integerzahlen l\u00e4nger als 64 Bit nicht vorgesehen. Programmierer, die sich z.B. in reinem C mit den Problemen besch\u00e4ftigen, k\u00f6nnen von &#8222;long long&#8220; Datentypen profitieren und einen betr\u00e4chtlichen Teil der Probleme damit &#8222;direkt&#8220; l\u00f6sen.<\/p>\n<p>Zun\u00e4chst versuchte ich, simple Rechenaufgaben mit irrsinnig gro\u00dfen Zahlen \u00fcber Strings zu l\u00f6sen. Dies funktioniert auch prinzipiell ganz gut, allerdings sind String-Zugriffe nicht sehr schnell und die Implementierungen von effizienten Divisions-, Multiplikations- oder Expontialfunktionen erwies sich als sehr zeitraubend und nicht zielf\u00fchrend.<\/p>\n<p>Bereits in der Zeit als studentische Hilfskraft am <a href=\"http:\/\/ls6-www.cs.uni-dortmund.de\/static\/pseudocore\/\">Lehrstuhl 6<\/a> nutzte ich die die <a href=\"http:\/\/gmplib.org\/\">GMP-Library<\/a>, um Berechnungen mit gro\u00dfen Zahlen effizient durchzuf\u00fchren. Die Programmierarbeiten, welche auf die libGMP zur\u00fcckgriffen, waren dabei allesamt in C durchgef\u00fchrt worden.<\/p>\n<p>Ich kannte also schon den Wert dieser Library, und wollte diese daher auch gerne in meine aktuellen Berechnungen im Rahmen von <a href=\"http:\/\/projecteuler.net\/\">ProjectEuler<\/a> einsetzen.<\/p>\n<h3>Voraussetzungen<\/h3>\n<ul>\n<li>Lauff\u00e4hige Visual Studio Umgebung (ich pers\u00f6nlich nutze Visual Studio 2008)<\/li>\n<li>Eine fertig kompilierte libgmp-3.dll, welche im Projektverzeichnis vorliegt<\/li>\n<\/ul>\n<p>F\u00fcr die libgmp-3.dll gibt es <a href=\"http:\/\/www.cs.nyu.edu\/exact\/core\/gmp\/\">hier<\/a> und <a href=\"http:\/\/suchideas.com\/journal\/2007\/07\/installing-gmp-on-windows\/\">hier<\/a> Anregungen, wie man die DLL erfolgreich unter Windows kompilieren kann.<\/p>\n<p>Wenn alles bereit ist, f\u00fcgt die <a title=\"libgmpWrapper\" href=\"download\/libgmpWrapper.vb\" target=\"_blank\">libgmpWrapper<\/a>\u00a0 in euer Projekt mit ein. Ich habe mein Projekt &#8222;Problems&#8220; genannt, entsprechend habe ich auch ein <a title=\"Testmodul\" href=\"download\/Testmodul.vb\" target=\"_blank\">Testmodul<\/a> erstellt, welches die libgmpWrapper importiert und die einfachen Zugriffe darauf demonstriert.<\/p>\n<h3>Hinweise!<\/h3>\n<ul>\n<li>Der Wrapper ist noch nicht f\u00fcr alle F\u00e4lle stabil, so hat er noch arge Probleme beim Zusammenspiel von Multiplikationen und Potenzierungen.<\/li>\n<li>Zudem gibt es noch das eine oder andere Speicherleck, welches durch die direkten Zugriffe auf die Variablen verursacht wird. Falls Sie damit Probleme haben, sollten Sie versuchen, auf die notwendigen Berechnungsfunktionen innerhalb der GMP-Library selbst zur\u00fcckzugreifen.<\/li>\n<li><b>Vorsicht<\/b> beim Zuweisen von Werten zu anderen Variablen. Haben Sie z.B. zwei GMP-Integer-Variablen (mpz) deklariert, sollten Sie diese <b>nicht<\/b> durch die Zuweisung <code>links = rechts<\/code> kopieren, da hier die Speicherparameter kopiert werden. Eine echte Kopie funktioniert nur \u00fcber den direkten Zugriff auf <code>mpz_set(links, rechts)<\/code>. Ich habe hier noch keine M\u00f6glichkeit gefunden, wie man den Wrapper f\u00fcr diesen Spezialfall erweitert.<\/li>\n<li>Manchmal kommt es auch aus noch nicht gekl\u00e4rter Ursache zu Abbr\u00fcchen, hierbei wird meist auf bestehende Speicherzellen geschrieben.<\/li>\n<\/ul>\n<h3>GPL-Hinweis<\/h3>\n<p>Achtung, f\u00fcr alle auf dieser Webseite ver\u00f6ffentlichten Skripte gilt die GPL v2 &#8211; ein entsprechendes Exemplar der Gesamtfassung finden Sie bei <a href=\"http:\/\/www.gnu.de\/documents\/gpl-2.0.de.html\">GNU<\/a>.<\/p>\n<pre>Copyright (C) 2010  Stefan Magerstedt\r\n\r\nDieses Programm ist freie Software. Sie k\u00f6nnen es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation ver\u00f6ffentlicht, weitergeben und\/oder modifizieren, entweder gem\u00e4\u00df Version 2 der Lizenz oder (nach Ihrer Option) jeder sp\u00e4teren Version.\r\n\r\nDie Ver\u00f6ffentlichung dieses Programms erfolgt in der Hoffnung, da\u00df es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT F\u00dcR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.\r\n\r\nSie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, schreiben Sie an die Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA.<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Bei einem meiner Hobbys, ProjectEuler versucht man mathematische Probleme mithilfe der Programmierung zu l\u00f6sen. Dabei greifen viele der dort registrierten Anwender auf professionelle Mathematik-Programme (Mathematica, etc.) zur\u00fcck. Ich finde es aber deutlich interessanter, die Probleme selbst zu analysieren und die erzeugten Programmschleifen immer wieder ein wenig zu verfeinern und zu verbessern, bis man innerhalb der &hellip; <a href=\"https:\/\/www.anginf.de\/?p=6\" class=\"more-link\"><span class=\"screen-reader-text\">GMP Wrapper f\u00fcr VB.NET<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6"}],"version-history":[{"count":5,"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts\/6\/revisions"}],"predecessor-version":[{"id":11,"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts\/6\/revisions\/11"}],"wp:attachment":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}