سؤال

حاليا أنا الاقتراض java.math.BigInteger من J# المكتبات كما هو موضح هنا.بعد أن لم تستخدم مكتبة للعمل مع كبيرة الصحيحه من قبل ، هذا يبدو بطيئا ، بناء على أمر من 10 مرات أبطأ حتى ulong طول أرقام.هل لدى أحدكم أي أفضل (ويفضل مجانا) المكتبات ، أو هو على هذا المستوى من الأداء العادي ؟

هل كانت مفيدة؟

المحلول

واعتبارا من NET 4.0 يمكنك استخدام فئة System.Numerics.BigInteger. راجع وثائق هنا: HTTP: // msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx

وثمة بديل آخر هو IntX الطبقة .

<اقتباس فقرة>   

وIntX هو الدقة التعسفي   مكتبة الأعداد الصحيحة كتب في النقي C #   2.0 مع بسرعة - O (N * تسجيل N) - الضرب الخوارزميات / تقسيم   التنفيذ. فإنه يوفر جميع   العمليات الأساسية على الأعداد الصحيحة مثل   بالإضافة إلى ذلك، الضرب، مقارنة،   أحادي المعامل التحول الخ.

نصائح أخرى

وF# أيضا يأتي مع واحد. يمكنك الحصول عليه في Microsoft.FSharp.Math.

ويستند الطبقة System.Numerics.BigInteger في. NET 4.0 على Microsoft.SolverFoundation.Common.BigInteger من مايكروسوفت للبحوث.

والطبقة BigInteger مؤسسة حلالا لتبدو performant للغاية. أنا لست متأكدا مما ترخيص إصدارها تحت، ولكن يمكنك الحصول عليه هنا (تنزيل وتثبيت مؤسسة حلالا والعثور على Microsoft.Solver.Foundation.dll).

أعتقد أنك يمكن تحسين تنفيذ إذا قمت بإجراء جميع العمليات على BigInts التي تسير على عودة النتائج أصغر من النوع الأصلي (على سبيل المثال.int64) على الأم أنواع التعامل فقط مع مجموعة كبيرة إذا كنت تنوي تجاوز.

تحرير هذا التنفيذ على codeproject, يبدو فقط 7 مرات أبطأ ...ولكن مع التحسين أعلاه يمكنك أن تحصل على أداء مماثل تقريبا الأصلية أنواع أعداد صغيرة.

وهنا العديد من تطبيقات BigInteger في C #. لقد استعملت تنفيذ BigInteger مونو، ويعمل بسرعة جدا (كنت استخدمه في CompactFramework)

نطاط القلعة

<وأ href = "https://svn.apache.org/repos/asf/incubator/heraldry/libraries/csharp/openid/trunk/Mono/Mono.Math/BigInteger.cs" يختلط = "نوفولو noreferrer" > مونو

وأنا لست متأكدا من الأداء، ولكن لديها أيضا و IronPython فئة BigInteger. وهو في مساحة الاسم Microsoft.Scripting.Math.

نعم، وسوف يكون بطيئا، و 10x الفرق هو ما كنت أتوقع. يستخدم BIGINT مجموعة لتمثيل طول التعسفي، ويجب أن تتم جميع العمليات يدويا (على عكس معظم الرياضيات الذي يمكن القيام به مباشرة مع CPU)

وأنا لا أعرف حتى إذا ناحية الترميز في التجمع سوف تعطيك الكثير من كسب الأداء أكثر من 10X، وهذا هو لعنة جميلة وثيق. كنت ابحث عن طرق أخرى لتحسين ذلك - أحيانا تبعا مشكلة الرياضيات هناك الحيل قليلا يمكنك القيام به لجعلها أسرع

.

Biginteger في وظيفة السابقة. أنا لا أعرف أي نوع من الأداء يحتاج لديك. لم أكن استخدامها في حالة كثيفة الأداء، ولكن ليس لديهم اي مشاكل معها.

وهذا قد يبدو وكأنه اقتراح غريب، ولكن هل اختبرت في العشري نوع لمعرفة مدى سرعة يعمل؟

ومجموعة عشري هو ± 1.0 × 10 ^ -28 إلى ± 7.9 × 10 ^ 28، لذلك قد لا يزال لا تكون كبيرة بما فيه الكفاية، لكنه أكبر من ULONG.

وكان من المفترض أن هناك فئة BigInteger في. NET 3.5، ولكن <لأ href = "http://blogs.msdn.com/bclteam/archive/2008/01/04/where-did-biginteger-go- MELITTA-andersen.aspx "يختلط =" نوفولو noreferrer "> حصلت على قطع .

وهذا لن مساعدتك، ولكن هناك كان من المفترض أن تكون الطبقة BigInteger في صافي 3.5. أنها حصلت على خفض، ولكن من تصريحات في PDC، فإنه سيكون في صافي 4.0. يبدو أنهم قضوا الكثير من الوقت الأمثل، لذلك يجب أن يكون الأداء أفضل بكثير مما كنت تحصل عليه الآن.

وعلاوة على ذلك، هذا السؤال هو في الأساس نسخة مكررة من كيف يمكنني يمثل عدد صحيح كبير جدا في. NET؟

وانظر الإجابات في هذا <وأ href = "https://stackoverflow.com/questions/262025/how-do-you-do-maths-or-math-with-numbers-bigger-than-maxvalue-in -c "> موضوع . سوف تحتاج إلى استخدام واحدة من طرف ثالث كبيرة المكتبات صحيح / الطبقات المتاحة أو الانتظار لC # 4.0 والتي سوف تشمل BigInteger نوع البيانات الأصلي.

هذه تبدو واعدة جدا.وهو C# المجمع على GMP.

http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html

وهناك أيضا غيرها من BigInteger الخيارات .صافي هنا على وجه الخصوص ، Mpir.Net

ويمكنك أيضا استخدام Math.Gmp.Native حزمة Nuget التي كتبت. شفرة المصدر متاح في جيثب ، والوثائق متاحة <لأ href = " https://machinecognitis.github.io/Math.Gmp.Native/html/846f5c8a-6cba-433e-9f18-cde2ff5695cd.htm "يختلط =" نوفولو noreferrer "> هنا . وإنما يعرض لصافي جميع وظائف المكتبة GMP حيث كما هو معروف عالي الكفاءة حساب دقيق تعسفي المكتبة.

وتتمثل

وصحيح التعسفية الدقة من قبل في mpz_t نوع . العمليات على هذه الأعداد الصحيحة تبدأ مع كل بادئة mpz_. فعلى سبيل المثال، mpz_add أو mpz_cmp . يتم إعطاء أمثلة التعليمات البرمجية المصدر لكل عملية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top