سؤال

لقد اكتشفت للتو ، لإحراجي ، أن تغذي الأسس السلبية mpz_pow_ui لا يعمل بشكل جيد للغاية. ("الدليل يقول لفترة طويلة ، كما تعلمون.") للآخر mpz_pow وظائف ، يستخدم الدليل المفاهيم التي لا أفهمها. فمثلا "قاعدة^إكسب عصري عصري" في التالي:

void mpz_powm (mpz_t rop, mpz_t base, mpz_t exp, mpz_t mod) 
void mpz_powm_ui (mpz_t rop, mpz_t base, unsigned long int exp, mpz_t mod)
Set _rop_ to _base_^_exp_ mod _mod_.
Negative exp is supported if an inverse base-1 mod mod exists (see mpz_invert in Section 5.9 [Number Theoretic Functions], page 35). If an inverse doesn’t exist then a divide by zero is raised.

في الكود التالي ، ما الذي يجب علي تغييره لجعله قادرًا على التعامل مع الأسس السلبية؟

#define Z(x) mpz_t x; mpz_init( x );

BSTR __stdcall IBIGPOWER(BSTR p1, long p2 ) {
    USES_CONVERSION;

    Z(n1);
    Z(res);

    LPSTR sNum1 = W2A( p1 );

    mpz_set_str( n1, sNum1, 10 );

    mpz_pow_ui( res, n1, p2 );

    char * buff =  (char *) _alloca( mpz_sizeinbase( res, 10 ) + 2 );

    mpz_get_str(buff, 10, res);

    BSTR bResult = _com_util::ConvertStringToBSTR( buff );
    return bResult;
}
هل كانت مفيدة؟

المحلول

ال mpz_t يمكن أن يخزن نوع البيانات الأعداد الصحيحة فقط ، و 2-18 ليس عدد صحيح. لحساب ذلك ، سيتعين عليك استخدام نوع النقطة العائمة mpf_t أو نوع الرقم العقلاني mpq_t.

نصائح أخرى

لن أقطع الرمز لك ولكني سأعلمك بما:

2 = 1/2ن

حتى تتمكن فقط mpf_t - ال mpz_t النوع متكامل ، لذا لا يمكن أن يمثل أرقامًا حقيقية مثل 2-18).

لا أعرف الكثير عن GMP ولكن:

2 ^ -18

يعادل:

1 / (2 ^ 18)

فلماذا لا تكتب وظيفة تعالج الأسس السلبية بهذه الطريقة؟

يتم دعم EXP السلبي في حالة وجود تعديل عكسي BASE-1 MOD (انظر MPZ_INVRET في القسم 5.9 [وظائف نظرية الرقم] ، الصفحة 35). إذا لم يكن هناك عكس ، فسيتم رفع الفجوة على الصفر.

إذا كنت تتحدث عن ذلك ، فهذا ينطوي على نظرية الأرقام. الانقسام ، أو عكس التعدد بدقة ، موجود فقط في ظروف معينة. لا أتذكر بالضبط القواعد ، لكن في الأساس يقول أن عملية القسم لن تعمل إذا قاعدة -1 عصري عصري غير موجود.

ما عليك القيام به يعتمد على ما تريد أن يحدث مع البتات التي ستضيع في العملية. نظرًا لأنك تتعامل مع الأعداد الصحيحة ، فإن رفع قوة سلبية يعني الانقسام (جيدًا ، المعاملة بالمثل) ، لكن GMP تقدم عدة أشكال من قطاع.

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