研究ノート:trichotomy(まあ、それはない、ああそうです)

明らかに保存されますが、妙に消え、本当に混乱、私は再び書かなければなりませんでした。
トピックリンク:P3382 [テンプレート] trichotomyが
、我々は極端なガイド機能がある知っている\(0 \) そして私たちは、この関数の導関数を見つける、あなたは半分に答えることができます。
ただ、この法律及び関連する問題の派生物、派生物の外観を学習。

\ [[F(X)\午後G(X)] = F(X)\午後G(X)\]

その後、我々はのために、加算および減算の導出をより導出\(N \)次多項式\(F(X-)\)

\ [F(X)= \和\ limits_ ^ na_ix ^ I \ {iが0 =}]

もちろん、それは誘導体であります:

\ [F '(x)= \和\ limits_ {I = 0} ^ {N-1}(i + 1)のA_ {I + 1}のx ^ I \]

直接シミュレーションだけで罰金。

多項式の評価

高次の用語について、簡単に引数を考えて\(X \)高速パワーが、これはです\(\ mathcal O(N \ Nログ)\) 、それを行うには良い方法はありませんか?
そこ!
中国の数学者秦九韶が提案早くも遠い昔のように、ホーナー法を、のは、それに栗を与えてみましょう。
多項式があります\(G(X-)が\)

\ [G(X)= AX ^ 3 + BX ^ 2 + CX + D \]

このように、我々はそれを簡素化:

\ [G(X)= X(+ BのX()+ C)+ D \]

これます\(\ mathcal O(N) \) 。

double f(double g,int n)//求n次多项式f(g)的值
{
	double x=fuc[n];
	for(int i=1;i<=n;i++) x=g*x+fuc[n-i];
	return x;
}

自分のアイデア

ときホーナー法、発見アルゴリズムの素晴らしい感覚を告げ:
高速電力がなぜ遅いですか?
明らかにプロセスが倍のパワーの数を繰り返され、その後、私たちは嵐の数のパワーを指示することができ、これもです\(\ mathcal O(N) \) の:

double f(double g,double n)
{
	double x=1,ans=0;
	for(int i=0;i<=n;i++) ans=ans+x*fuc[i],x*=g;
	return ans;
} 

この質問は、それを終了します。

\(コード\)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define read(x) scanf("%d",&x)
#define read_d(x) scanf("%lf",&x)
double fuc[20];
double a[20];
int n;
double l,r;
double f(double g,int n)
{
	double x=fuc[n];
	for(int i=1;i<=n;i++) x=g*x+fuc[n-i];
	return x;
}
int main()
{
	read(n),read_d(l),read_d(r);
	for(int i=n;i>=0;i--) read_d(a[i]);
	//求导 
	for(int i=n;i>=1;i--) fuc[i-1]=a[i]*i;
	double mid;
	for(int i=1;i<=100;i++)
	{
		mid=(l+r)/2;
		if(f(mid,n-1)<0) r=mid;
		else l=mid;
	}
	printf("%.5lf\n",mid);
	return 0;
}

あなたは、多項式関数の導関数のための一般式を強制的に無知に見えるのであれば、あまり直接、定義によって、うまくない:
私たちは、デリバティブの定義を知っています:

\ [F '(x)= \ LIM \限界_ {\ mathit \デルタX \ RIGHTARROW 0} \ dfrac \ {\ mathit \デルタX}、{F -f(x)は(X + \ mathit \デルタX)}]

我々はでき\(\ mathit \デルタ\ xは ) などの小さな数に設定されている(^ {10 --10} \)\ライン上で、次に、。
兄がこれをやっている、私はコードを運びます。

\(コード\)

#include <bits/stdc++.h>
using namespace std;
const int N = 15;
const double eps = 1e-10;;
int n;
double L, R, a[N];
double f(double x) {
	double c[N];
	c[n] = a[n];
	for (int i = n - 1; i >= 0; --i) c[i] = c[i + 1] * x + a[i];
	return c[0];
}
double check(double x) {
	double dx = eps;
	double dy = f(x + eps) - f(x);
	return dy / dx;
}
int main() {
	cin >> n >> L >> R;
	for (int i = 0; i <= n; ++i) cin >> a[n - i];
	double mid; 
	while (R - L > eps) {
		mid = (L + R) / 2;
		if (check(mid) > 0) L = mid;
		else R = mid; 
	}
	printf("%.5lf", L);
	return 0;
} 

複雑さについて:
バイナリ\(100 \)倍言葉です\(\ mathcal O(100N) \) 、または書かれた\(\ mathcal O(N- \ログEPS)\)
\(PS \):I \(yyは\)実際に速くホーナー法よりも\(8 \; MS \)

おすすめ

転載: www.cnblogs.com/tlx-blog/p/12623204.html