2014-12-04 21 views
-3

我需要採用以下代碼並使用mpz_替換使用我自己的代碼的調用。通過更改起始代碼在c中進行基本乘法

void Product32(void *a, void *b, void *c, unsigned int wa, 
unsigned int ba, unsigned int wb, unsigned int bb, unsigned int 
*wc, unsigned int *bc){ 

mpz_t x,y,z; 
mpz_init(x); 
mpz_init(y); 
mpz_init(z); 

/* Cast a and b into short integers of size 32 bits */ 
unsigned int *int_a = (unsigned int *) a; 
unsigned int *int_b = (unsigned int *) b; 

/* Now int_a can be view as an array of words of size 32 
* bits */ 
/* Similarly for int_b */ 
//printf("%lu %lu \n", int_a[0], int_a[*sa - 1]); 
//printf("%lu %lu \n", int_b[0], int_b[*sb - 1]); 

mpz_import(x, wa, ORDER, WORDBYTES, ENDIAN, NAILS, a); 
mpz_import(y, wb, ORDER, WORDBYTES, ENDIAN, NAILS, b); 
mpz_mul(z,x,y); 

c = mpz_export(c, wc, ORDER, WORDBYTES, ENDIAN, NAILS, z); 
} 

我遇到的問題是,我不明白是什麼mpz_import或mpz_export完成的,而我尋找一個問題的答案已經來到了空。

我也覺得我的類型是完全錯誤的。

我忘了調用Product32的主函數,因爲我知道問題不存在;上面的代碼工作,下面的代碼不會。

這是我有:

/* Since we are working with string of potentially different lengths, 
first we need to be able to make the two strings of equal length. */ 

int makeEqualLength(int arr1[], int arr2[]) 
{ 
int len1 = sizeof(arr1); 
int len2 = sizeof(arr2); 
int i; 
if (len1 < len2) 
{ 
for (i = 0 ; i < len2 - len1 ; i++) 
    arr1[i] = arr1[i+1]; 
    arr1[0] = 0; 
return len2; 
} 
else if (len1 > len2) 
{ 
for (i = 0 ; i < len1 - len2 ; i++) 
    arr2[i] = arr2[i+1]; 
    arr2[0] = 0; 
} 
return len1; // If len1 >= len2 
} 


void Product32(void *a, void *b, void *c, unsigned int wa, 
unsigned int ba, unsigned int wb, unsigned int bb, unsigned int 
*wc, unsigned int *bc){ 

/* Cast a and b into short integers of size 32 bits */ 
unsigned int *int_a = (unsigned int *) a; 
unsigned int *int_b = (unsigned int *) b; 
unsigned int *int_c = (unsigned int *) c;  

/* Now int_a can be view as an array of words of size 32 
* bits */ 
/* Similarly for int_b */ 
//printf("%lu %lu \n", int_a[0], int_a[*sa - 1]); 
//printf("%lu %lu \n", int_b[0], int_b[*sb - 1]); 

int n = makeEqualLength(int_a, int_b); 
unsigned int i,j,k; 
double p; 

for (k = 0; k < n; i++){ 
int_c[k] = 0; 
} 
for (i = n - 1; i >= 0; i--){ 
double d = 0; 
for (j = n - 1; j >= 0; j--){ 
    p = (int_a[i]) * (int_b[j]) + int_c[i + j] + d; 
    int_c[i + j] = p % 32; 
    int_c = p/32 
    } 
int_c[i + n] = d; 
} 
} 
+0

爲什麼不在函數參數中聲明'a''等於'unsigned int *',看到函數知道它是什麼? – 2014-12-04 21:34:26

+0

我假設你的意思是將聲明更改爲無效的無符號整型*?我無法在主函數中將呼叫更改爲Product32。事實上,我根本不允許改變主要功能。因此,我無法更改函數參數。 – sydwys8 2014-12-04 21:48:21

+0

爲什麼不呢?調用者使用的參數不是'unsigned int *'嗎? – 2014-12-04 21:55:30

回答

1

什麼你要找的是The GNU Multiple Precision Arithmetic Librarydocumentation。你會在那裏找到mpz_*函數的定義。

具體而言,mpz_importmpz_export。他們完成的任務(將mpz_t變量轉換爲二進制數據的任意字)可以在這裏完全描述,它應該可以幫助你。

+0

爲什麼投下來?我專門回答了「我遇到的問題」。 – Chris 2014-12-04 21:40:36

+1

我沒有downvote,但通常當您鏈接到第三方網站上的答案時,最好包含所述答案的摘要。這可以改善未來死鏈接的問題,因爲即使您提供的鏈接不再活躍,讀者仍然可以獲得要點。 – 2014-12-04 21:54:15

+0

謝謝@SchighSchagh--這是一個很好的觀點。我有點擴大了我的答案。不幸的是,如果不簡單地重新發布它,很難總結簡潔的GNU文檔。 :) – Chris 2014-12-04 22:05:58

相關問題