C++で曲線上の特定の点における法線の方程式を求める
曲線 y = x(A - x) が与えられたとき、この曲線上の任意の点 (x, y) における法線の方程式を求める方法を解説します。ここで A は整数定数、x と y も整数とします。
数学的アプローチ
1. 点が曲線上にあるか確認
まず、与えられた点 (x, y) が曲線 y = x(A - x) = Ax - x² を満たすかどうかを確認します。
2. 微分して接線の傾きを求める
曲線を x で微分すると、接線の傾き dy/dx が得られます:
\(\frac{dy}{dx} = A - 2x\)
3. 法線の傾きと方程式
法線の傾きは接線の傾きの負の逆数 -dx/dy となります。点 (x, y) を通る法線の方程式は:
\(Y - y = -\frac{1}{A - 2x}(X - x)\)
ただし、A - 2x = 0(接線が水平)の場合、法線は垂直線 X = x となります。
C++ 実装例
#include <iostream>
using namespace std;
void getNormal(int A, int x, int y) {
// 接線の傾きを計算
int slope = A - 2 * x;
// 点が曲線上にあるか確認: y = x(A - x) = Ax - x^2
if (y == A * x - x * x) {
if (slope == 0) {
// 接線が水平 → 法線は垂直線
cout << "x = " << x;
} else {
// 法線の方程式: (Y - y) = -1/slope * (X - x)
// 整数係数で表示するため整理
// slope * (Y - y) = -(X - x)
// slope*Y - slope*y = -X + x
// X + slope*Y = x + slope*y
cout << "x + " << slope << "y = " << x + slope * y;
}
} else {
cout << "Not possible: point is not on the curve";
}
}
int main() {
int A = 5, x = 2, y = 6; // y = 2(5-2) = 6
cout << "Equation of normal is: ";
getNormal(A, x, y);
return 0;
}
実行結果
Equation of normal is: x + 1y = 8
解説
- 元のコードの問題点: 元のサンプルコードでは曲線の方程式が
y == (2 * x - x * x)となっていましたが、正しくはy == A * x - x * xです。 - 法線の方程式の整理: 傾きが分数になるのを避けるため、両辺に傾きをかけて整数係数の形
X + mY = cで出力しています。 - エッジケース: 傾きが 0(接線が水平)の場合は法線が垂直線
x = 定数となり、傾きが無限大(接線が垂直)の場合は法線が水平線y = 定数となります。
-
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 の最大のべき乗(指数)を求めることが