アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の画像の7から始まる素数表がありますが、プログラミング(BASIC言語)で作られているのですが、画像の解説をお願いできないでしょうか?すみませんが。

「素数表について。」の質問画像

質問者からの補足コメント

  • うーん・・・

    ①はなぜあなたはそう思ったのでしょうか?ご教授下さい。すみませんが。

    No.7の回答に寄せられた補足コメントです。 補足日時:2021/01/19 19:43
  • うーん・・・

    5, 7, 11, 13, 17の5個までが登録されるようにして。というように考えるとどうなるのでしょうか?
    ご教授下さい。すみませんが。

    No.17の回答に寄せられた補足コメントです。 補足日時:2021/01/22 16:56
  • うーん・・・

    #14の54行で、フラグを立てるのは分かるのですが、この場合のフラグは何なのでしょうか?ご教授下さい。すみませんが。

    No.22の回答に寄せられた補足コメントです。 補足日時:2021/01/22 22:57
  • うーん・・・

    同じく#14のプログラミングの所です。

    No.26の回答に寄せられた補足コメントです。 補足日時:2021/01/23 09:47
  • うーん・・・

    すみません。
    ここです。
    5行目の間違いだと思うのですが。
    Link: http://codepad.org/Oxfd5gz9

    No.34の回答に寄せられた補足コメントです。 補足日時:2021/01/26 03:58

A 回答 (38件中21~30件)

> ①あなたのプログラムの、9個を登録してというところは、あなたの#14のプログラムの中のどこでしょうか?



うーん・・・読解力がないなぁ。
まずは、

2行目。ここで配列pを宣言してるんで、ここでメモリ5個分(l = 5)が確保される。
3~6行目。ここで配列aを宣言して、具体的に値を代入してるんで、メモリ3個分が確保されている。
20行目。唯一登場してるループ構文。カウンタiがインデックスレジスタである。

一応、これで計9個ですよ。対応を考えれば自ずと答えは分かるでしょ?

高級言語では取り立てて「メモリx番地をfooせよ」なんて命令は書きません。実際、メモリと1対1対応なのか、と言うと必ずしもそうじゃないですしね。
高級言語で書かれたプログラムはインタプリタ、ないしはコンパイラによって「自動的に」メモリ上に展開されます。従って、こっち側とすると特に「メモリx番地のfooをbarせよ」とか意識しなくて済むのです。BASICだったらBASICが全部面倒を見てくれる。
だからその本の例の該当箇所は「余計な事を書いて読者を混乱させてる」だけなのです。

> ②インデックス-レジスタについて、もう少し詳しくご教授下さい。すみませんが。

何が知りたいんだろ。
まず、インデックスって言い方ですが、直訳すれば指数です。でもこれじゃあ分かりづらい。
平たく言うと、高等学校数学で出てくる数列

a_i

の表記のiの事です。添字、とか訳されますが。大した意味じゃない。

例えば繰り返しをする際に「10回繰り返せ」と指定する。その際の10を保存する場所が、ここで言うインデックスレジスタです。
そして、単純なモデルだと、繰り返しを指定された何かが1回実行される度に-1されていく。インデックスレジスタが0になった時に計算を脱出して繰り返しを終了する、とかですね。計数カウンタ、等と呼んだりもしますが、ハードウェアでそういう役割を担わされてるレジスタをインデックスレジスタと呼ぶのです。

でもだからおかしいんですよ。「インデックスレジスタ」っていきなりここで登場してるんですか?フツー、該当ページ「以前に」解説が出てなければ分からなくて当然な筈なんですが。
もし、万が一、件のページ以前に説明が無かったとしたら、その本はとんだクズ本ですよ。
    • good
    • 0
この回答へのお礼

すみません。ENDIFと、ELSEの意味は、何でしょうか?#14のプログラムの56の ifと小文字になっていますが、IFの間違いですよね?ご教授下さい。すみません。揚げ足をとってしまって。

お礼日時:2021/01/22 18:49

> 9個を登録で、 (1個は、ループを制限するためのインデックス-レジスタ)を使い


> l=5したがって、5,7,11,13,15 となっています。初期条件に、他に登録する個数の上限lを用意する。と書かれているのですが。もし、9個が誤植で、5個を登録してだとどうなるのでしょうか?ご教授下さい。すみませんが。

例えばね。tknakamuriさんじゃないけど、好意的に解釈すると、です。
電卓の記憶装置の構成が次のようにメモリ(記憶装置)が16個あるとする。

|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|

まあ、これらをレジスタ、って呼んでも構いませんが。いずれにせよ、記憶装置が16個あるとする。9個とか10個、とかよりよっぽどあり得る構成ですね。「でも全部使おうとはしない」。なるたけ最小限で・・・と考える。
プログラミング上、変数を「保存」したり、配列に使うのはこれらメモリです。
インデックスレジスタ、と言うのは別の人も書いてましたけど、ループする場合の回数を保存する場所、です。例えばこの場合、メモリの0番地をループカウンタにする。そうすればここがインデックスレジスタになります。

|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|

インデックスレジスタ

次に、

> 2,3,5は別に作っておく

と言うのをマトモに受けるとすれば、こいつらを記憶させる為に記憶領域を消費せねばならない。3つ必要なんでメモリの1番地~3番地を使う。

|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|
  ↑↑↑
  2 3 5

そうすると、残りのウチ、長さlの配列を計算された素数を突っ込む為に用意しないとならない。lが5だとすると例えばメモリ4番地から8番地を配列の為に使うとする。

|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|
     ↑↑↑↑↑
ここを長さl(=5)の配列とする。

そうすれば、使用するのは0番地、1番地、2番地、3番地、4番地、5番地、6番地、7番地、8番地、の計9個、です。9番地から15番地まではとりあえず使わないで・・・って事ですね。

ただ、これは「好意的に解釈して」、ですよ。何度も言いますが、ハッキリ言ってその本は「何を書いてるんだか」サッパリです。少なくとも件のページの該当箇所だと意味不明なbubblingです。
一応メモリレベルで説明しましたが、BASICで通常、こんな考え方はせんです。と言うか、そういうシチメンド臭い事考えずに済むように、高級言語が開発されているのです。
要するに、BASICで書いても、上のような現象は確かに起きるかもしれません。でもそれは、プログラミング言語が面倒を見てくれるトコなんで、こっち側としてはんな事気にせんで良いのです。
    • good
    • 0
この回答へのお礼

では、好意的に理解して、①あなたのプログラムの、9個を登録してというところは、あなたの#14のプログラムの中のどこでしょうか?②インデックス-レジスタについて、もう少し詳しくご教授下さい。すみませんが。
以上2点についてお願いします。

お礼日時:2021/01/22 17:30

> ①21のTHENに何もないのですが、これはどうなるのでしょうか?



いや、あるでしょう。
下の22の

GOTO 60

ってのがそれ、です。

算法2で書かれてる通り

> どれかで割り切れれば6へ

とそのまま、です(まぁ、プログラム上は6じゃなくって60へ飛んでますけど)。

やってる事は本に書かれてる手順そのまんまですよ。
言ったでしょ?「理解力」じゃなくって「読解力」の問題だ、と。

> ②後、9個を登録してのところは、どこでしょうか?

これも既に言った通りです。「分からん」と。
もう一回繰り返しますが、

> ある電卓で記憶装置を

以降の記述は、字面通り読めば「BASICと全く関係ない」話です。
その「ある電卓」ってのはここで、集まってくれた皆、誰も知らんのですよ。「ある」とか言われても。CASIOなのかHPなのか、はたまたSHARPの某なのか。サッパリ分からん。
知ってるとしたら本自体持って読んでる「貴方しか」いない。他の誰も知らんのです。貴方が一番知ってる可能性が高いんですが、ここまで貴方が読んできた筈なのに分からんのなら、おかしな話だ。つまり本自体に全く記述が無い可能性がある。
要するに、「誰も知らない」電卓の話がいきなり始まって、「記憶装置が・・・」とか言われても「ポカーン」とするしかないでしょ?だから言ったのです「おかしな欠陥品の本だ」と。
大体、記憶装置が8個って書いてるのに「9個を登録して」ってのがおかしい。8個なら最上限8個までしか登録出来んだろ、と考えるのがフツーです。
故に。
一番疑わしいのは「単なる誤植」なんですよ。数勘定が合わん以上、そう考えるしかない。
#8でtknakamuriさんがかなり好意的な解釈してくれていますけどね。もっともこの本の文章だと説明になってないような説明なんで、だからむしろ「好意的過ぎる解釈」だと思います。
tknakamuriさんが#7で「ひどくざっぱな書き方」って言ってるんですが、なんかこのページ見る限り、本全体が「ひどくざっぱな書き方」で書かれてるような気がします。ぶっちゃけ「良くない」「書いてる作者だけが理解してる」悪書の典型な気がしますね。
だから貴方が混乱するし、ページ見た全員がファイナル・ファンタジーで言う「コンフュ」かかった状態になってるのです。
いずれにせよ、ハッキリ言うけど、この辺はBASICは全く関係ない話、です。つまり貴方が「BASICで」と言ってる以上、傍流の話なんで理解せんで構いません。と言うか、件のページだけ見せられても、何が前提条件なのか(例えばBASICって言われてもコンピュータじゃなくって電卓の、なのか?)サッパリ分からんので、これ以上「理解」するのは無理だから、です。
この回答への補足あり
    • good
    • 0
この回答へのお礼

9個を登録で、 (1個は、ループを制限するためのインデックス-レジスタ)を使い
l=5したがって、5,7,11,13,15 となっています。初期条件に、他に登録する個数の上限lを用意する。と書かれているのですが。もし、9個が誤植で、5個を登録してだとどうなるのでしょうか?ご教授下さい。すみませんが。

お礼日時:2021/01/22 16:51

> すみません。

!`は何でしょうか?これは何か意味があるのでしょうか?ご教授下さい。すみませんが。

FullBASICでは(と言うか十進BASICでは?)コメントは!'から書き始めます。ここから行末までは読み飛ばされるんで、計算には関係ないです。
プログラムを書いてる際に、書いてる本人でさえ

「何書いてたか後で読み直すと忘れてる」

事が山ほどあるので、マトモなプログラミング言語では、通常、注釈する為にコメントを書き込む事が出来、その辺は言語処理系には関係ないので、読み飛ばされるように設計されています。
C言語なんかでは

/* コメント */

と書き、Pythonでは

# コメント

と書き、Pascalでは

(* コメント *)

と書き、Lispでは

; コメント

と書きます。ご覧のように言語によって違う。
十進BASICの場合は

!' コメント

と書く。それだけの話、です。

注: 1980年出版の本らしいんで、その時期のBASICだと恐らく

REM コメント

だったんでしょうが、十進BASICだと上に書いた通り、!'で書いた方が便利そうだったんで使っただけ、です。
    • good
    • 0
この回答へのお礼

すみません。2つほど聞いてもよろしいでしょうか?①21のTHENに何もないのですが、これはどうなるのでしょうか?②後、9個を登録してのところは、どこでしょうか?ご教授下さい。すみませんが。

お礼日時:2021/01/22 04:41

> 2,3,5は別に作っておく。

とはどう言うことでしょうか?別に記録ということは、例えばどこに記録するのでしょうか?ご教授下さい。すみませんが。

提示したFullBASICのコードでは、3要素の配列aを作成して、2、3、5をそこに突っ込んでいます(3〜6行目)。
プログラミングでは、大体、「記録」と言う場合、変数を作ったり配列を作って代入する事を言います。
でも、この仕様上、ここに入れてるだけで「何もしてません」ね。入れてるだけ、です。

コメントをつけてるので良く読みましょう。
「素数表について。」の回答画像15
    • good
    • 0
この回答へのお礼

すみません。!`は何でしょうか?これは何か意味があるのでしょうか?ご教授下さい。すみませんが。

お礼日時:2021/01/21 23:06

僕も#5氏が仰る通り、「何はともあれ言われた通りに実装してみる」のが一番だと思うんですけどね。


こんな事言うと他の人に怒られるかもしれませんが(笑)、この算法1〜6なんつーのはアルゴリズムでも何でもない(アルゴリズムだったらもっとスマートでしょう)。単なる「仕様」です。
従って仕様の通り実装出来るか否か、が問題。
となると、「理解力」が重要と言うより、「読解力」と言うか「翻訳力」がキモとなる。

ついでに言うと、この本は確かに分かりづらい。貴方はBASICって言ってるけど、件の

> ある電卓で〜

の以降はフツーのBASICの話とは思えない。どっちかっつーとアセンブリレベルの話に飛んでいて、話の一貫性がないんですね。そもそもフツー、BASICではインデックスレジスタなんぞ表面に出てきません。従って、前提条件が何なのかサッパリ分からん。個数も不可思議です(誤植なのか?と言う疑いもある)。
貴方がこの本持ってる以上、ここの前にインデックスレジスタとかハードウェアレベルの話が書いてましたか?書いてないとしたらとんでもねぇ欠陥本です(笑)。いきなりそんな話出てきてもフツーは困るだけ、でしょう。
場合によっては「書いた本人だけが分かってる」と言う最悪の本の可能性がありますねぇ。

ISO/JIS FullBASICを使えば写真のようなコードになります。原則n*10行とその周辺は算法nに対応しています。
実行してみたい場合、以下のリンクから十進BASICを入手して打ち込んで実行してみてください。本の例示(表1)の通りの素数が算出されます。

十進BASIC(ISO/JIS FullBASIC実装):
https://hp.vector.co.jp/authors/VA008683/

ぶっちゃけ、tknakamuriさんがPythonで書いてくれた#11のコードの方が、よりスマートで現代的なんで分かりやすいんですけど、参考まで、に。
「素数表について。」の回答画像14
    • good
    • 0
この回答へのお礼

2,3,5は別に作っておく。とはどう言うことでしょうか?別に記録ということは、例えばどこに記録するのでしょうか?ご教授下さい。すみませんが。

お礼日時:2021/01/21 22:54

>はい。

理解しています。2,3,5は別に作っておくとはどう言うことでしょうか?2,3,5 は、別に記録しておくと考えると、どこに記録すれば良いのでしょうか?出力は、どこになるのかと言うことです。

人の話聞かないで、自分の聞きたいことだけ聞いてるだけじゃん。理解しているなら、わかるはず。すでに説明しています。
    • good
    • 1

まず、素数の定義を理解していますか?



素数とは、

1 より大きい自然数で、正の約数が 1 と自分自身のみであるもののこと。素数でないものは合成数と呼びます。

ですね。

細かいアルゴリズムは別として、与えられた自然数 n が素数であるか、それとも合成数であるかを判定するためのアルゴリズムは、

定義に従えば、試し割りの実行です。

1 : nを2 から √n 以下の全ての素数で割る。
2 : n が √n 以下の全ての素数で割り切れなければ n は素数である。
3 : 素数が見つかったらリストに加えて、次の判定に利用する。

だけです。これを理解しないと、プログラムのロジックを考えても永遠に答えはでません。

1は、定義からわかりますね。√n以下というのは、そこまでで割り切れなければ、掛け算の構造上、√nからnの間の数で割り切れる相手はいないことになるので、判定はそこで終わりにします。

それだけのことですが、例えば2の倍数は、4以上はすべて定義から素数ではないし、3の倍数も5の倍数も同様です。なので、それらを初期値にして、なるべく、試し割りの回数を少なくするために、ロジック工夫しているということです。

レジスタはCPUのメモリのことで、配列のカウンターに使うものをインデックスレジスタと呼びました。この教科書が機械語や昔のコンピュータの時代のものなのでしょうね。カウンターに使う変数とか、配列の引数と思えばいいです。
    • good
    • 1
この回答へのお礼

はい。理解しています。2,3,5は別に作っておくとはどう言うことでしょうか?
2,3,5 は、別に記録しておくと考えると、どこに記録すれば良いのでしょうか?
出力は、どこになるのかと言うことです。

お礼日時:2021/01/21 19:21

pythonでかいた素数を1万まで吐くプログラム。


線で囲ったのが 3. で割る数を端折る部分。
#python素人でもわかるように、pythonらしくない冗長な
#書き方にしました。

こんな簡単なプログラムでも、今のパソコンなら
10 ms しかかかりません。端折りを入れないと
0.3 秒くらいかかります。

これに、割る数を素数リストから持ってきたり、さらに 6で割って
余りが 1, 5 になる数のみを候補にするようにすれば
何倍かは早くなると思います。pythonで書けばもう +10行くらい
だと思います。
「素数表について。」の回答画像11
    • good
    • 0

>①はなぜあなたはそう思ったのでしょうか?ご教授下さい。

すみませんが。

5より大きい素数は、2の倍数でも、3の倍数ではありませんから
6で割って余りが 1 か 5 の数が素数の候補となります。
#2飛び/4飛びのくり返しでインクリメントする
全部調べるより、調べる数が 1/3 になって効率があがるということです。

2,3が素数で、判定する数が5より大きいことを前提にした判定方法です。

素数判定プログラムでは定番の手法です。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!