ページ 11

超初級質問

Posted: 2013年4月15日(月) 02:37
by KKK
こんにちはC言語初心者です。
以下のプログラムをつくのに少しいきづまったのでどなたかご教授いただけたら幸いです。

ある素数pが与えられたとし、元が{0、1、、、、、p-1}であり演算がModule-o(pを法とする乗余系)に従う場合を考える。たとえばp=5のとき群の元は{1、2,3,4}であり、2+4の演算結果は1となる。同様に3×4=2 加法の単位元は0乗法の単位元は1である。
ここでmodulo-pの加算および乗算の演算を考えるとき、元{0,1、、、、、p-1}に対する加法の逆元、および、乗法の逆元を表示するプログラム。

表示方法として以下のようにしたい。
---OP=ADD---
0 0
1 4
2 3
3 2
4 1
---OP=MUL---
0 *
1 1
2 3
3 2
4 1

コード:

#include <stdio.h>


int add_func(int p){
  int i, add_inv;
  printf("---OP==ADD---");
  for (i = 0; i < p; i++) {
    printf("%d  \n", i);
    add_inv = p - i;
    printf("&d\n", add_inv);
  }
  return (0);
}


int mul_func(int p){
  
  printf("---OP==MUL---\n");
  printf("0  *\n1  1\n"); //0  *  1  1を先に 表示()

  for (i=2; i < p; i++) {
    int mal_inv;
    for(mal_inv = 2; mal_inv < p; mal_inv++) {
      if(((mal_inv * i)%p) == 1) {
        printf("%d  %d\n", i, mal_inv );
	break;
        } 
    }
  }
  return(0);
}

int main(void)
{
  int p;
  printf("type the prime number\n");
  scanf("%d", &p);
  add_func(p);
  mul_func(p);
  
  return(void);
}

Re: 超初級質問

Posted: 2013年4月15日(月) 02:39
by KKK
できるだけこのプログラムを変えずにアドバイスいただけると嬉しいです。

Re: 超初級質問

Posted: 2013年4月15日(月) 06:41
by h2so5
具体的にどこで行き詰まっているのでしょうか。

Re: 超初級質問

Posted: 2013年4月15日(月) 09:13
by フリオ
ぱっと見て気になったところだけ、

>add_inv = p - i;
剰余をとらないといけないのでは?

>---OP=MUL---
>...
>4 1
4 4では?

Re: 超初級質問

Posted: 2013年4月15日(月) 09:17
by non
自分で作っていないプログラムだから、どこをどうしてよいかわからないという課題の丸投げではないでしょうか。

Re: 超初級質問

Posted: 2013年4月15日(月) 09:58
by kkk
h2so5 さんが書きました:具体的にどこで行き詰まっているのでしょうか。
すみません大事なところを言ってなかったですね。
一応プログラム的には完成だと思ったのですがどうしてもコンパイルエラーが出てコンパイルできません。コンパイルエラーの内容は後述します。(今忘れてしまったので)

Re: 超初級質問

Posted: 2013年4月15日(月) 10:06
by kkk
フリオ さんが書きました:ぱっと見て気になったところだけ、

>add_inv = p - i;
剰余をとらないといけないのでは?

>---OP=MUL---
>...
>4 1
4 4では?
加法の場合はp-i で出るの出るのこうしました、が今考えるとI=0 の時は成り立たないですね。直します。
それと4 1も間違いで4 4 デスね。ありがとうございます

Re: 超初級質問

Posted: 2013年4月15日(月) 10:07
by kkk
non さんが書きました:自分で作っていないプログラムだから、どこをどうしてよいかわからないという課題の丸投げではないでしょうか。
課題の丸投げではありません一から自分でつくりましたこの単純なプログラムに3時間かけて

Re: 超初級質問

Posted: 2013年4月15日(月) 11:08
by non
そうですか。失礼しました。あまりにも単純なC言語の文法間違い等があり、自分で作ったとは思えなくて失礼しました。

1 21行:変数iの宣言がない。
2 41行:returnの引数がおかしい。
3 6行、8行 改行の位置がおかしい。
4 10行 &dが間違い

Re: 超初級質問

Posted: 2013年4月15日(月) 13:07
by box
main関数の最後にある

コード:

    return(void);
は、何がしたいのか不明です。

add_func(), mul_func()の戻り値を
呼び出し側で全く使っている気配がないので、
戻り値の型をintにする必然性がないように思います。

Re: 超初級質問

Posted: 2013年4月16日(火) 01:52
by KKK
non さんが書きました:そうですか。失礼しました。あまりにも単純なC言語の文法間違い等があり、自分で作ったとは思えなくて失礼しました。

1 21行:変数iの宣言がない。
2 41行:returnの引数がおかしい。
3 6行、8行 改行の位置がおかしい。
4 10行 &dが間違い
申し訳ないです、全く駄目初心者なんです、、ありがとうございます。
一応指摘いただいたところを直しましてあと少しだと思うんですがまだこの二つのエラーがでます
24:5: error: stray '\201' in program
24:5: error: stray '@' in program
あともう少しアドバイスを頂けたらとおもいます。
変更後のプログラムは以下です。

コード:

 
#include <stdio.h>


int add_func(int p){
  int i, add_inv;
  printf("---OP==ADD---\n");
  printf("0  0\n");
  for (i = 0; i < p; i++) {
    printf("%d  \n", i);
    add_inv = p - i;
    printf("%d\n", add_inv);
  }
  return (0);
}


int mul_func(int p){
  int i;
  printf("---OP==MUL---\n");
  printf("0  *\n1  1\n"); //0  0  1  1 表示

  for (i=2; i < p; i++) {
    int mal_inv;
    for(mal_inv = 2; mal_inv < p; mal_inv++) {
      if(((mal_inv * i)%p) == 1) {
        printf("%d  %d\n", i, mal_inv );
	break;
      } 
    }
  }
  return(0);
}

int main(void)
{
  int p;
  printf("type the prime number\n");
  scanf("%d", &p);
  add_func(p);
  mul_func(p);
  
  return(0);

}

Re: 超初級質問

Posted: 2013年4月16日(火) 01:54
by kkk
box さんが書きました:main関数の最後にある

コード:

    return(void);
は、何がしたいのか不明です。

add_func(), mul_func()の戻り値を
呼び出し側で全く使っている気配がないので、
戻り値の型をintにする必然性がないように思います。
なるほどご指摘ありがとうございます。これはint の方で関数を指定しておいてそれを使わなければerrorの原因になるのでしょうか?

Re: 超初級質問

Posted: 2013年4月16日(火) 05:40
by へにっくす
KKK さんが書きました:24:5: error: stray '\201' in program
24:5: error: stray '@' in program
全角のスペースがないかチェックしてください。
全角文字が含まれていいのは、文字列の中か、コメントだけです。

Re: 超初級質問

Posted: 2013年4月16日(火) 06:19
by box
25行目のfor文の中に全角の空白があります。取り除いてください。
kkk さんが書きました: これはint の方で関数を指定しておいてそれを使わなければerrorの原因になるのでしょうか?
何をおっしゃりたいのか今ひとつわかりませんが、要するに、
関数の戻り値の型がvoid以外である、ということは、
その戻り値を呼び出し元で使うからこそそうしているのであって、
今回のコードではadd_func()やmul_func()は0を戻していますが
呼び出し元のmain()ではそれを使っていないので、
使わないんだったらそもそもvoidでいいのでは?ということです。

Re: 超初級質問

Posted: 2013年4月16日(火) 23:29
by kkk
へにっくす さんが書きました:
KKK さんが書きました:24:5: error: stray '\201' in program
24:5: error: stray '@' in program
全角のスペースがないかチェックしてください。
全角文字が含まれていいのは、文字列の中か、コメントだけです。
ありがとうございました。とてもたすかりました