C++で曲線上の特定の点における接線を求める方法
問題の概要
曲線 y = x(A − x) が与えられたとき、この曲線上の指定された点 (x, y) における接線の方程式を求めます。ここで A は整数、x と y もそれぞれ整数とします。
解法の考え方
接線を求める前に、まず与えられた点が実際に曲線上に存在するかどうかを確認する必要があります。点が曲線上にあることが確認できたら、次の手順で接線の方程式を導きます。
- 曲線の式を微分し、任意の点における傾き(微分係数)を求める
- 点の x 座標を微分結果に代入し、その点での接線の傾きを確定させる
- 接線の公式に点の座標と傾きを代入して方程式を完成させる
ステップ1:曲線を微分する
曲線 y = x(A − x) を x について微分すると、次のようになります。
dy/dx = A − 2x
ステップ2:接線の方程式に代入する
接線の方程式は、次の公式で表されます。
Y − y = (dy/dx) × (X − x)
ここに dy/dx = A − 2x と点 (x, y) の座標を代入すれば接線の方程式が得られます。整理すると、次の形になります。
Y = (A − 2x)X − (A − 2x)x + y
C++での実装例
以下は、A = 2 の曲線について、点 (2, 0) における接線を求める C++ プログラムの例です。
#include <iostream>
using namespace std;
// 曲線 y = x(A - x) 上の点 (x, y) における接線を求める
void getTangent(int A, int x, int y) {
// 点が曲線上にあるかどうかを確認
if (y != x * (A - x)) {
cout << "この点は曲線上にありません" << endl;
return;
}
int m = A - 2 * x; // 傾き dy/dx = A - 2x
int b = y - m * x; // 切片 b = y - m*x
if (m == 0) {
// 傾きが 0 のときは水平な接線になる
cout << "y = " << b;
} else {
cout << "y = ";
if (m == 1)
cout << "x";
else if (m == -1)
cout << "-x";
else
cout << m << "x";
if (b > 0)
cout << "+" << b;
else if (b < 0)
cout << b;
}
}
int main() {
int A = 2, x = 2, y = 0;
cout << "接線の方程式: ";
getTangent(A, x, y);
return 0;
}
実行結果
接線の方程式: y = -2x+4
コードの解説
このプログラムでは、最初に「y == x × (A − x)」という条件で、与えられた点が曲線上にあるかどうかを判定しています。点が曲線上に存在しない場合、その点における接線は定義できないため、その旨を表示して処理を終了します。
点が曲線上にあることが確認できたら、傾き m = A − 2x と切片 b = y − m×x を計算します。傾きが 0 の場合は接線は水平線 y = b となり、それ以外の場合は符号に応じて「y = mx + b」の形式で方程式を出力します。
今回の例では A = 2、x = 2 なので、傾きは 2 − 2×2 = −2、切片は 0 − (−2)×2 = 4 となり、接線は y = −2x + 4 であることがわかります。実際に X = 2 を代入すると Y = 0 となり、接線が点 (2, 0) を通っていることも確認できます。
-
C++でドラゴン曲線シーケンスのn番目の項を求める方法
この記事では、ドラゴン曲線(Dragon Curve)シーケンスのn番目の項を求めるC++プログラムを紹介します。ドラゴン曲線シーケンスとは、無限に続く二進列(0と1のみで構成される数列)のことで、「1」から始まり、各ステップで前の項の各要素に対して「1」と「0」を交互に追加していくことで次の項を形成していきます。 第1項: 1 第2項: 110 第3項: 1101100 第4項: 110110011100100 まず「1」から始め、前の項の各要素の後に「1」と「0」を交互に付け加えていきます。新しい項が得られたら、それを現在の項として同じ手順をn回繰り返すことで、目的の項を生成できます
-
C++でnCrが指定された素数で割り切れるかどうかを判定する方法
3つの変数 N、R、P があるとします。N と R から二項係数 NCR を求め、P は素数とします。このとき、NCR が P で割り切れるかどうかを判定するのが本記事の目的です。例えば、N = 7、R = 2、P = 3 の場合、7C2 = 21 となり、21 は 3 で割り切れるため、結果は true となります。二項係数は一般的に次の式で表されます。NCR = N! / (R! × (N − R)!)ここでルジャンドルの定理(Legendres Formula)を活用します。この定理を使うと、N!、R!、(N − R)! のそれぞれを割り切る素数 P の最大のべき乗(指数)を求めることが