質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

C言語でチェビシェフの多項式を100回目まで作りたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 273

nekodoro

score 2

チェビシェフ多項式の100回目をC言語で作りたいのですが
どこから初めていいのかわかりません。
教えて下さるとうれしいです。
T1(X)=1
T2(x)=X
T3(X)=2x^2-1
T4(x)=4x^3-3x
というのがチェビシェフ多項式です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Penpen7

    2020/07/14 00:35 編集

    「作りたい」というのはどういう意味でしょうか?
    値を求めたいのか数式を作りたいのか

    キャンセル

  • 退会済みユーザー

    2020/07/14 00:55

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

0

数式を取り扱うには、数式処理用のライブラリが必要になります。まずはその辺りから調査したらいかがでしょうか。私が一つ見つけたのはLeptonでした。
https://mattn.kaoriya.net/software/lang/c/20151014155115.htm
もしくはライブラリを使わなくとも、係数を配列で保存しておいて、漸化式でどんどん式を増やしていけばいいと思います。
何れにせよ、以下のような漸化式を処理すればいいでしょう。
T_{n+1}=2xT_{n}-T_{n-1}(n=1,2,...)
T0=1
T1=x

なお、言語にこだわらなければ、PythonのSympyで容易に多項式を求めることができます。
https://pianofisica.hatenablog.com/entry/2020/05/16/080000#Chebyshev%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%83%81%E3%82%A7%E3%83%93%E3%82%B7%E3%82%A7%E3%83%95%E5%A4%9A%E9%A0%85%E5%BC%8F
上記サイトから引用したソースコード(チェビシェフ多項式T0からT6を出力する)

import sympy as sp
sp.init_printing()
n=sp.symbols('n', integer=True)
x=sp.var('x')
C_list = []
for n in range(7):
    c = sp.chebyshevt(n,x)
    C_list.append(c)
C_list

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

多項式の係数を並べた配列 c[N] を用意します。X^i の係数が c[i] なわけね。
そーすっと、

  • 多項式に「x を掛ける」は配列c[N]の値をひとつズラす
  • 多項式に「2 を掛ける」は配列c[N]の値を全部2倍する
  • 多項式から「多項式d[N]を引く」は配列c[i]からd[i]を引く(i=0..N-1)
    ことになります。

これだけ用意すれば T(n+1) = 2xT(n) - T(n-1) が計算できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/14 09:37 編集

    T100(x) = 2^98 x^99 + ... ですから、int64_t c[N]; だと 2^98 はオーバーフローです。
    多倍長計算が必要でしょう。

    キャンセル

  • 2020/07/14 09:44 編集

    ふぉろーありがとです。
    ちょっとやってみた:
    1: 1x0
    2: 1x1
    3: 2x2 -1x0
    4: 4x3 -3x1
    5: 8x4 -8x2 1x0
    6: 16x5 -20x3 5x1
    7: 32x6 -48x4 18x2 -1x0
    8: 64x7 -112x5 56x3 -7x1
    9: 128x8 -256x6 160x4 -32x2 1x0
    10: 256x9 -576x7 432x5 -120x3 9x1
    11: 512x10 -1280x8 1120x6 -400x4 50x2 -1x0
    12: 1024x11 -2816x9 2816x7 -1232x5 220x3 -11x1
    13: 2048x12 -6144x10 6912x8 -3584x6 840x4 -72x2 1x0
    14: 4096x13 -13312x11 16640x9 -9984x7 2912x5 -364x3 13x1
    ...早晩パンクしますな。

    多倍長計算が必要ではあるけど、2倍する と 引く とがあればいいのでさほどに面倒ではなさげ。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る