Frage

Ich habe gerade zu meiner Verlegenheit herausgefunden, dass negative Exponenten zu negativen Exponenten ernannt werden mpz_pow_ui Funktioniert nicht sehr gut. ("Das Handbuch sagt nicht signiert lang, weißt du.") Für den anderen mpz_pow Funktionen verwendet das Handbuch Konzepte, die ich nicht verstehe. Zum Beispiel "Base^Exp Mod Mod" im Folgenden:

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.

Was muss ich im folgenden Code ändern, um negative Exponenten zu bewältigen?

#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;
}
War es hilfreich?

Lösung

Das mpz_t Datentyp kann nur Ganzzahlen speichern und 2-18 ist keine Ganzzahl. Um dies zu berechnen, müssen Sie den Gleitkomma-Typ verwenden mpf_t oder der rationale Zahlentyp mpq_t.

Andere Tipps

Ich werde den Code nicht für Sie schneiden, aber ich werde Sie darauf aufmerksam machen:

2-n = 1/2n

Sie können also einfach den positiven Exponenten übergeben und 1 durch diese Zahl teilen (und wählen Sie einen Nichtteger-Typ wie mpf_t - das mpz_t Typ ist integral 2-18).

Ich weiß nicht viel über GMP, aber:

2 ^ -18

ist äquivalent zu:

1 / (2 ^ 18)

Warum also nicht eine Funktion schreiben, die auf diese Weise negative Exponenten behandelt?

Negative Exp wird unterstützt, wenn ein inverser Basis-1-Mod-Mod vorhanden ist (siehe mpz_invert in Abschnitt 5.9 [theoretische Funktionen mit Zahlen], Seite 35). Wenn eine Inverse nicht existiert, wird eine Kluft durch Null erhöht.

Wenn Sie darüber sprechen, beinhaltet das die Zahlentheorie. Die Abteilung oder genauer inverse Multplikation besteht nur bei bestimmten Bedingungen. Ich erinnere mich nicht genau an die Regeln, aber im Grunde heißt es, dass die Abteilungsoperation nicht funktioniert, wenn Basis-1 Mod Mod existiert nicht.

Was Sie tun müssen, hängt davon ab, was Sie mit den Bits, die in der Operation verloren gehen, passieren möchten. Da Sie mit Zahlen zu tun haben, impliziert die Erhöhung einer negativen Leistung eine Aufteilung (nun, die Gegenleistung), aber GMP bietet verschiedene Formen von Aufteilung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top