Публикация этого вопроса после 3-4 дней безумного поиска в Интернете, но ничего не помогло.Честно говоря, на данный момент, я думаю, я даже не знаю, что искать больше.Мне действительно нужны некоторые «указатели» о том, как обращаться с указателями и массивами, это убивает меня.
Я просто пытаюсь вычислить целочисленное возведение в степень, используя метод двоичного возведения в степень.Вот мой код для вычисления 2 ^ n в качестве примера -
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <gmp.h>
// Compute z = x^n
void mpz_binexp_pow(mpz_t z, const mpz_t x, const mpz_t n) {
/*
* Local variables
*/
char *pointer = NULL;
char *pc = NULL;
char *c = NULL;
pointer = (char*) malloc(sizeof(mpz_t));
pc = pointer;
/*
* Get the binary representation of the exponent
*/
c = mpz_get_str(pointer,2,n);
c[strlen(c)+1] = '\0';
printf("%s\n\n",c);
/*
* Perform left to right binary exponentiation steps
*/
/*for(int i = 0;i<strlen(c);i++) {
mpz_pow_ui(z, z, 2);
if (c[i] == '1')
mpz_mul(z, z, x);
printf("%c - \n", c[i]);
//gmp_printf("%Zd\n", z);
}*/
while(*c){
mpz_pow_ui(z, z, 2);
if (*c == '1')
mpz_mul(z, z, x);
c++;
printf("%c - \n", *c);
//gmp_printf("%Zd\n", z);
}
free(pc);
}
int main(int argc, char *argv[]) {
mpz_t z; mpz_init(z); mpz_set_ui(z,1);
mpz_t x; mpz_init(x); mpz_set_ui(x,2);
mpz_t n; mpz_init(n); mpz_set_ui(n,1449728);
mpz_binexp_pow(z,x,n);
return 0;
}
Все отлично работает для небольших показателей, таких как 2, 3 и т. Д., Но на самом деле все сходят с ума от сравнительно больших чисел, как показано на рисунке (мне нужноэто работает для показателей, значительно превышающих показанные здесь)
Теперь, когда я запускаю этот код несколько раз, я получаю правильный вывод только примерно в 1 из 15 выполнений, что, на мой взгляд, не имеет большого значения.Я не могу понять, что происходит не так.Я получаю правильный бинарный респ.показателя, который я могу увидеть, распечатав его.Например, бинарный респ.экспоненты 1449728 равен 101100001111100000000. Теперь, когда я захожу в цикл для выполнения шагов l2r, почти каждый раз, когда программа запутывается после третьего нуля в последней нулевой последовательности, т.е. она выполняется правильно до 1011000011111000 этой точки ,Иногда я вижу некоторые другие символы, такие как «?»и «>» вместо остальных нулей, а иногда я просто ничего не вижу, программа зависает.Что происходит?
Я очень уверен, что это проблема с указателем, и мои знания об указателях чрезвычайно слабые, но я бы очень хотел получить подсказки о том, как это исправить, а также о том, что происходит и что я имею в виду.делает неправильно.
РЕДАКТИРОВАТЬ Этот вопрос был решен.Я хочу, чтобы этот вопрос был закрыт или удален.