質問編集履歴
3
p,q,Nが検証フェーズ前では正しい値が与えられたことを追加しました.
    
        title	
    CHANGED
    
    | 
         
            File without changes
         
     | 
    
        body	
    CHANGED
    
    | 
         @@ -2,6 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            なお,以前同じ内容で質問してベストアンサーを決めて解決済みになってしまったため,もう一度質問し直しました.また,以前ご指摘のあった,領域の問題は解決したと思います.
         
     | 
| 
       3 
3 
     | 
    
         
             
            40,41行目でp,q,Nを宣言して,151行目以降の検証フェーズにて,値がおかしくなっています.
         
     | 
| 
       4 
4 
     | 
    
         
             
            コードの下に実行結果を載せました.
         
     | 
| 
      
 5 
     | 
    
         
            +
            検証フェーズの直前で,p,q,Nの値を確認したところ正しい値が出力されました.
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
            ```C
         
     | 
| 
       7 
8 
     | 
    
         
             
            //逐次秘密分散法の実装
         
     | 
2
出力結果を更新しました.
    
        title	
    CHANGED
    
    | 
         
            File without changes
         
     | 
    
        body	
    CHANGED
    
    | 
         @@ -283,6 +283,32 @@ 
     | 
|
| 
       283 
283 
     | 
    
         
             
            ```
         
     | 
| 
       284 
284 
     | 
    
         | 
| 
       285 
285 
     | 
    
         
             
            ```出力結果
         
     | 
| 
      
 286 
     | 
    
         
            +
            initialize.c:59:15: warning: implicit declaration of function 'pow1' is invalid in C99 [-Wimplicit-function-declaration]
         
     | 
| 
      
 287 
     | 
    
         
            +
                  R[i][j]=pow1(g,s1[i][j],N);
         
     | 
| 
      
 288 
     | 
    
         
            +
                          ^
         
     | 
| 
      
 289 
     | 
    
         
            +
            initialize.c:89:29: warning: implicit declaration of function 'phi' is invalid in C99 [-Wimplicit-function-declaration]
         
     | 
| 
      
 290 
     | 
    
         
            +
              printf("Φ(N)=%d, f=%d\n",phi(N),f);
         
     | 
| 
      
 291 
     | 
    
         
            +
                                       ^
         
     | 
| 
      
 292 
     | 
    
         
            +
            initialize.c:91:10: warning: implicit declaration of function 'pow1' is invalid in C99 [-Wimplicit-function-declaration]
         
     | 
| 
      
 293 
     | 
    
         
            +
              int R0=pow1(g,s0,N);
         
     | 
| 
      
 294 
     | 
    
         
            +
                     ^
         
     | 
| 
      
 295 
     | 
    
         
            +
            initialize.c:112:10: warning: implicit declaration of function 'jacobi' is invalid in C99 [-Wimplicit-function-declaration]
         
     | 
| 
      
 296 
     | 
    
         
            +
                  if(jacobi(K[i],P)==1){
         
     | 
| 
      
 297 
     | 
    
         
            +
                     ^
         
     | 
| 
      
 298 
     | 
    
         
            +
            initialize.c:130:24: warning: implicit declaration of function 'h' is invalid in C99 [-Wimplicit-function-declaration]
         
     | 
| 
      
 299 
     | 
    
         
            +
                      r[i][j]=fmod(h(I[i][j],R1[i],t[i],P),P);
         
     | 
| 
      
 300 
     | 
    
         
            +
                                   ^
         
     | 
| 
      
 301 
     | 
    
         
            +
            initialize.c:142:20: warning: implicit declaration of function 'h' is invalid in C99 [-Wimplicit-function-declaration]
         
     | 
| 
      
 302 
     | 
    
         
            +
                  y[i][j]=fmod(h(I[i][j],S[i],t[i],P),P);
         
     | 
| 
      
 303 
     | 
    
         
            +
                               ^
         
     | 
| 
      
 304 
     | 
    
         
            +
            initialize.c:161:45: warning: more '%' conversions than data arguments [-Wformat]
         
     | 
| 
      
 305 
     | 
    
         
            +
                  printf("R0=%d, s[%d][%d]=%d, N=%d, p=%d, q=%d\n",R0,s1[i][j],N,p,q);
         
     | 
| 
      
 306 
     | 
    
         
            +
                                                       ~^
         
     | 
| 
      
 307 
     | 
    
         
            +
            initialize.c:163:46: warning: format specifies type 'int' but the argument has type 'double' [-Wformat]
         
     | 
| 
      
 308 
     | 
    
         
            +
                  printf("I'[%d][%d]=%d,f=%d,N=%d\n",i,j,I1[i][j],f,N);
         
     | 
| 
      
 309 
     | 
    
         
            +
                                     ~~                  ^~~~~~~~
         
     | 
| 
      
 310 
     | 
    
         
            +
                                     %f
         
     | 
| 
      
 311 
     | 
    
         
            +
            8 warnings generated.
         
     | 
| 
       286 
312 
     | 
    
         
             
            m=3
         
     | 
| 
       287 
313 
     | 
    
         
             
            t[0]=2, n[0]=2
         
     | 
| 
       288 
314 
     | 
    
         
             
            t[1]=2, n[1]=3
         
     | 
1
どこで宣言して,どこがおかしくなったのか具体的な行数を追加し,出力結果を載せました.
    
        title	
    CHANGED
    
    | 
         
            File without changes
         
     | 
    
        body	
    CHANGED
    
    | 
         @@ -1,5 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ある秘密分散法のプログラムを作成していたところ,元の方で定義していた"p","q","N"(他にもあるかもしれません)の値をのちにもう一度使おうとしたら,おかしな値になってしまいました.理由がわかる方がいたらご教授いただきたいです.
         
     | 
| 
       2 
2 
     | 
    
         
             
            なお,以前同じ内容で質問してベストアンサーを決めて解決済みになってしまったため,もう一度質問し直しました.また,以前ご指摘のあった,領域の問題は解決したと思います.
         
     | 
| 
      
 3 
     | 
    
         
            +
            40,41行目でp,q,Nを宣言して,151行目以降の検証フェーズにて,値がおかしくなっています.
         
     | 
| 
      
 4 
     | 
    
         
            +
            コードの下に実行結果を載せました.
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
       3 
6 
     | 
    
         
             
            ```C
         
     | 
| 
       4 
7 
     | 
    
         
             
            //逐次秘密分散法の実装
         
     | 
| 
       5 
8 
     | 
    
         
             
            #include <stdbool.h>
         
     | 
| 
         @@ -158,13 +161,13 @@ 
     | 
|
| 
       158 
161 
     | 
    
         
             
              for(i=0;i<m;i++){
         
     | 
| 
       159 
162 
     | 
    
         
             
                for(j=0;j<n[i];j++){
         
     | 
| 
       160 
163 
     | 
    
         
             
                  //I'ijを計算する
         
     | 
| 
      
 164 
     | 
    
         
            +
             
     | 
| 
      
 165 
     | 
    
         
            +
            //N,p,qの値がおかしい
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
       161 
     | 
    
         
            -
                  printf("R0=%d, s[%d][%d]=%d, N=%d\n",R0,s1[i][j],N);
         
     | 
| 
      
 167 
     | 
    
         
            +
                  printf("R0=%d, s[%d][%d]=%d, N=%d, p=%d, q=%d\n",R0,s1[i][j],N,p,q);
         
     | 
| 
       162 
168 
     | 
    
         
             
                  I1[i][j]=pow1(R0,s1[i][j],N);
         
     | 
| 
       163 
169 
     | 
    
         
             
                  printf("I'[%d][%d]=%d,f=%d,N=%d\n",i,j,I1[i][j],f,N);
         
     | 
| 
       164 
170 
     | 
    
         
             
                  //Rij==I'ij^f mod Nを検証する
         
     | 
| 
       165 
     | 
    
         
            -
             
     | 
| 
       166 
     | 
    
         
            -
            ここでN,p,qの値がおかしくなっている.
         
     | 
| 
       167 
     | 
    
         
            -
             
     | 
| 
       168 
171 
     | 
    
         
             
                  int h=pow1(I1[i][j],f,N);
         
     | 
| 
       169 
172 
     | 
    
         
             
                  printf("I'[%d][%d]^f mod N=%d\n",i,j,h);
         
     | 
| 
       170 
173 
     | 
    
         
             
                  printf(" R[%d][%d]=%d\n",i,j,R[i][j]);
         
     | 
| 
         @@ -175,8 +178,35 @@ 
     | 
|
| 
       175 
178 
     | 
    
         
             
                }
         
     | 
| 
       176 
179 
     | 
    
         
             
              }
         
     | 
| 
       177 
180 
     | 
    
         
             
              if(countv==0)printf("全て正しいシェアでした\n");  
         
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
      
 181 
     | 
    
         
            +
              /*
         
     | 
| 
      
 182 
     | 
    
         
            +
                  //復元フェーズ
         
     | 
| 
      
 183 
     | 
    
         
            +
                //プレイヤー
         
     | 
| 
      
 184 
     | 
    
         
            +
              double S1[m],r[m]; //求めるSi
         
     | 
| 
      
 185 
     | 
    
         
            +
              double y1[m][P];
         
     | 
| 
      
 186 
     | 
    
         
            +
              for(i=1;i<=m;i++){
         
     | 
| 
      
 187 
     | 
    
         
            +
                S1[i]=0;
         
     | 
| 
      
 188 
     | 
    
         
            +
                for(j=1;j<=t[i];j++){
         
     | 
| 
      
 189 
     | 
    
         
            +
                  //ラグランジュ補間を使用して,Siを求める
         
     | 
| 
      
 190 
     | 
    
         
            +
                  y1[i][j]=fmod(h(I[i][j],S[i],t[i],P),P);
         
     | 
| 
      
 191 
     | 
    
         
            +
                  printf("y[%d][%d]=%lf, ",i,j,y1[i][j]);
         
     | 
| 
      
 192 
     | 
    
         
            +
                  r[i]=y1[i][j];
         
     | 
| 
      
 193 
     | 
    
         
            +
                  for(k=1;k<=t[i];k++){
         
     | 
| 
      
 194 
     | 
    
         
            +
                    if(j!=k){
         
     | 
| 
      
 195 
     | 
    
         
            +
                      r[i]*=(0-I1[i][k])/(I1[i][j]-I1[i][k]);
         
     | 
| 
      
 196 
     | 
    
         
            +
                      
         
     | 
| 
      
 197 
     | 
    
         
            +
                    }
         
     | 
| 
      
 198 
     | 
    
         
            +
                  }
         
     | 
| 
      
 199 
     | 
    
         
            +
                  
         
     | 
| 
      
 200 
     | 
    
         
            +
                  S1[i]+=r[i];
         
     | 
| 
      
 201 
     | 
    
         
            +
                  printf("S[%d]=%lf ",i,S1[i]);
         
     | 
| 
      
 202 
     | 
    
         
            +
                  S1[i]=fmod(S1[i],P);
         
     | 
| 
      
 203 
     | 
    
         
            +
                  
         
     | 
| 
      
 204 
     | 
    
         
            +
                }
         
     | 
| 
      
 205 
     | 
    
         
            +
                S1[i]=round(S1[i]);
         
     | 
| 
      
 206 
     | 
    
         
            +
                printf("S[%d]=%lf\n",i,S1[i]);
         
     | 
| 
      
 207 
     | 
    
         
            +
              }
         
     | 
| 
       179 
208 
     | 
    
         | 
| 
      
 209 
     | 
    
         
            +
            */
         
     | 
| 
       180 
210 
     | 
    
         
             
              return 0;
         
     | 
| 
       181 
211 
     | 
    
         
             
            }
         
     | 
| 
       182 
212 
     | 
    
         | 
| 
         @@ -250,6 +280,86 @@ 
     | 
|
| 
       250 
280 
     | 
    
         
             
                if (a == 0) return 1;
         
     | 
| 
       251 
281 
     | 
    
         
             
                return x;
         
     | 
| 
       252 
282 
     | 
    
         
             
            }
         
     | 
| 
      
 283 
     | 
    
         
            +
            ```
         
     | 
| 
       253 
284 
     | 
    
         | 
| 
       254 
     | 
    
         
            -
             
     | 
| 
      
 285 
     | 
    
         
            +
            ```出力結果
         
     | 
| 
      
 286 
     | 
    
         
            +
            m=3
         
     | 
| 
      
 287 
     | 
    
         
            +
            t[0]=2, n[0]=2
         
     | 
| 
      
 288 
     | 
    
         
            +
            t[1]=2, n[1]=3
         
     | 
| 
      
 289 
     | 
    
         
            +
            t[2]=3, n[2]=4
         
     | 
| 
      
 290 
     | 
    
         
            +
            P=23
         
     | 
| 
      
 291 
     | 
    
         
            +
            s[0]=3, s[1]=5, s[2]=5, 
         
     | 
| 
      
 292 
     | 
    
         
            +
            p=7, q=3, N=21
         
     | 
| 
      
 293 
     | 
    
         
            +
            g=5
         
     | 
| 
      
 294 
     | 
    
         
            +
            s[0][0]=1, s[0][1]=2, 
         
     | 
| 
      
 295 
     | 
    
         
            +
            s[1][0]=1, s[1][1]=2, s[1][2]=3, 
         
     | 
| 
      
 296 
     | 
    
         
            +
            s[2][0]=1, s[2][1]=2, s[2][2]=3, s[2][3]=4, 
         
     | 
| 
      
 297 
     | 
    
         
            +
            R[0][0]=5, R[0][1]=4, 
         
     | 
| 
      
 298 
     | 
    
         
            +
            R[1][0]=5, R[1][1]=4, R[1][2]=20, 
         
     | 
| 
      
 299 
     | 
    
         
            +
            R[2][0]=5, R[2][1]=4, R[2][2]=20, R[2][3]=16, 
         
     | 
| 
      
 300 
     | 
    
         
            +
            レベル1,2,3,で一意である.
         
     | 
| 
      
 301 
     | 
    
         
            +
            s0=5
         
     | 
| 
      
 302 
     | 
    
         
            +
            Φ(N)=12, f=17
         
     | 
| 
      
 303 
     | 
    
         
            +
            R0=17
         
     | 
| 
      
 304 
     | 
    
         
            +
            I[0][0]=17, I[0][1]=16, 
         
     | 
| 
      
 305 
     | 
    
         
            +
            y[0][0]=20, y[0][1]=19, 
         
     | 
| 
      
 306 
     | 
    
         
            +
            S[0]=3, s'[0]=10
         
     | 
| 
      
 307 
     | 
    
         
            +
            I[1][0]=17, I[1][1]=16, I[1][2]=20, 
         
     | 
| 
      
 308 
     | 
    
         
            +
            K[1]=4
         
     | 
| 
      
 309 
     | 
    
         
            +
            K[1]は平方剰余である
         
     | 
| 
      
 310 
     | 
    
         
            +
            S[1]=2
         
     | 
| 
      
 311 
     | 
    
         
            +
            y[1][0]=19, y[1][1]=18, y[1][2]=22, 
         
     | 
| 
      
 312 
     | 
    
         
            +
            S[1]=2, s'[1]=2
         
     | 
| 
      
 313 
     | 
    
         
            +
            I[2][0]=17, I[2][1]=16, I[2][2]=20, I[2][3]=4, 
         
     | 
| 
      
 314 
     | 
    
         
            +
            K[2]=10
         
     | 
| 
      
 315 
     | 
    
         
            +
            K[2]は平方剰余でない
         
     | 
| 
      
 316 
     | 
    
         
            +
            R[2]=5
         
     | 
| 
      
 317 
     | 
    
         
            +
            r[2][0]=2, r[2][1]=4, r[2][2]=20, r[2][3]=18, 
         
     | 
| 
      
 318 
     | 
    
         
            +
            y[2][0]=22, y[2][1]=1, y[2][2]=17, y[2][3]=15, 
         
     | 
| 
      
 319 
     | 
    
         
            +
            S[2]=2
         
     | 
| 
      
 320 
     | 
    
         
            +
            R0=17, s[1][21]=7, N=3, p=23, q=0
         
     | 
| 
      
 321 
     | 
    
         
            +
            I'[0][0]=17,f=21,N=0
         
     | 
| 
      
 322 
     | 
    
         
            +
            I'[0][0]^f mod N=-2147483648
         
     | 
| 
      
 323 
     | 
    
         
            +
             R[0][0]=5
         
     | 
| 
      
 324 
     | 
    
         
            +
            レベル0の0番目のプレイヤーは,誤ったシェアを提出しました
         
     | 
| 
      
 325 
     | 
    
         
            +
            R0=17, s[2][21]=7, N=3, p=0, q=0
         
     | 
| 
      
 326 
     | 
    
         
            +
            I'[0][1]=17,f=21,N=0
         
     | 
| 
      
 327 
     | 
    
         
            +
            I'[0][1]^f mod N=-2147483648
         
     | 
| 
      
 328 
     | 
    
         
            +
             R[0][1]=4
         
     | 
| 
      
 329 
     | 
    
         
            +
            レベル0の1番目のプレイヤーは,誤ったシェアを提出しました
         
     | 
| 
      
 330 
     | 
    
         
            +
            R0=17, s[1][21]=7, N=3, p=0, q=0
         
     | 
| 
      
 331 
     | 
    
         
            +
            I'[1][0]=17,f=21,N=0
         
     | 
| 
      
 332 
     | 
    
         
            +
            I'[1][0]^f mod N=-2147483648
         
     | 
| 
      
 333 
     | 
    
         
            +
             R[1][0]=5
         
     | 
| 
      
 334 
     | 
    
         
            +
            レベル1の0番目のプレイヤーは,誤ったシェアを提出しました
         
     | 
| 
      
 335 
     | 
    
         
            +
            R0=17, s[2][21]=7, N=3, p=0, q=0
         
     | 
| 
      
 336 
     | 
    
         
            +
            I'[1][1]=17,f=21,N=0
         
     | 
| 
      
 337 
     | 
    
         
            +
            I'[1][1]^f mod N=-2147483648
         
     | 
| 
      
 338 
     | 
    
         
            +
             R[1][1]=4
         
     | 
| 
      
 339 
     | 
    
         
            +
            レベル1の1番目のプレイヤーは,誤ったシェアを提出しました
         
     | 
| 
      
 340 
     | 
    
         
            +
            R0=17, s[3][21]=7, N=3, p=0, q=0
         
     | 
| 
      
 341 
     | 
    
         
            +
            I'[1][2]=17,f=21,N=0
         
     | 
| 
      
 342 
     | 
    
         
            +
            I'[1][2]^f mod N=-2147483648
         
     | 
| 
      
 343 
     | 
    
         
            +
             R[1][2]=20
         
     | 
| 
      
 344 
     | 
    
         
            +
            レベル1の2番目のプレイヤーは,誤ったシェアを提出しました
         
     | 
| 
      
 345 
     | 
    
         
            +
            R0=17, s[1][21]=7, N=3, p=0, q=0
         
     | 
| 
      
 346 
     | 
    
         
            +
            I'[2][0]=17,f=21,N=0
         
     | 
| 
      
 347 
     | 
    
         
            +
            I'[2][0]^f mod N=-2147483648
         
     | 
| 
      
 348 
     | 
    
         
            +
             R[2][0]=5
         
     | 
| 
      
 349 
     | 
    
         
            +
            レベル2の0番目のプレイヤーは,誤ったシェアを提出しました
         
     | 
| 
      
 350 
     | 
    
         
            +
            R0=17, s[2][21]=7, N=3, p=0, q=0
         
     | 
| 
      
 351 
     | 
    
         
            +
            I'[2][1]=17,f=21,N=0
         
     | 
| 
      
 352 
     | 
    
         
            +
            I'[2][1]^f mod N=-2147483648
         
     | 
| 
      
 353 
     | 
    
         
            +
             R[2][1]=4
         
     | 
| 
      
 354 
     | 
    
         
            +
            レベル2の1番目のプレイヤーは,誤ったシェアを提出しました
         
     | 
| 
      
 355 
     | 
    
         
            +
            R0=17, s[3][21]=7, N=3, p=0, q=0
         
     | 
| 
      
 356 
     | 
    
         
            +
            I'[2][2]=17,f=21,N=0
         
     | 
| 
      
 357 
     | 
    
         
            +
            I'[2][2]^f mod N=-2147483648
         
     | 
| 
      
 358 
     | 
    
         
            +
             R[2][2]=20
         
     | 
| 
      
 359 
     | 
    
         
            +
            レベル2の2番目のプレイヤーは,誤ったシェアを提出しました
         
     | 
| 
      
 360 
     | 
    
         
            +
            R0=17, s[4][21]=7, N=3, p=0, q=0
         
     | 
| 
      
 361 
     | 
    
         
            +
            I'[2][3]=17,f=21,N=0
         
     | 
| 
      
 362 
     | 
    
         
            +
            I'[2][3]^f mod N=-2147483648
         
     | 
| 
      
 363 
     | 
    
         
            +
             R[2][3]=16
         
     | 
| 
      
 364 
     | 
    
         
            +
            レベル2の3番目のプレイヤーは,誤ったシェアを提出しました
         
     | 
| 
       255 
365 
     | 
    
         
             
            ```
         
     |