سؤال
لقد اكتشفت للتو ، لإحراجي ، أن تغذي الأسس السلبية 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;
}
نصائح أخرى
لن أقطع الرمز لك ولكني سأعلمك بما:
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 تقدم عدة أشكال من قطاع.