問題規模が大きくなる時、コストの増加は線形、指数、対数などの形となります。
問題
SICPの練習 1.15 です。x は十分に小さい時、sin(x) = x は近似成立。また、sin(x) = 3 * sin(x / 3) - 4 * sin(x / 3)3 は常に成り立ちます。上記ルールに基づいて sin(a) を求めて下さい。また、その時の空間と時間コストは何でしょう?
解答
-
-
-
-
- import std.stdio;
- import std.math;
-
- int loop;
- float SMALL_ENOUGH = 0.1;
-
- float sine(float x) {
- if (abs(x) <= SMALL_ENOUGH) {
- return x;
- }
- return p(sine(x / 3.0));
- }
-
- float cube(float x) {
- return x * x * x;
- }
-
- float p(float x) {
- loop++;
- return 3 * x - 4 * cube(x);
- }
-
- void main() {
- loop = 0;
- float x = 1.215;
- float ret = sine(x);
- writefln("sine(%f) = %f, loop = %d", x, ret, loop);
-
- loop = 0;
- x = 12.15;
- ret = sine(x);
- writefln("sine(%f) = %f, loop = %d", x, ret, loop);
-
- loop = 0;
- x = 121.5;
- ret = sine(x);
- writefln("sine(%f) = %f, loop = %d", x, ret, loop);
-
- loop = 0;
- x = 1215;
- ret = sine(x);
- writefln("sine(%f) = %f, loop = %d", x, ret, loop);
-
- loop = 0;
- x = 12150;
- ret = sine(x);
- writefln("sine(%f) = %f, loop = %d", x, ret, loop);
-
- loop = 0;
- x = 121500;
- ret = sine(x);
- writefln("sine(%f) = %f, loop = %d", x, ret, loop);
- }
/** * sin(x) の計算 */ import std.stdio; import std.math; int loop; float SMALL_ENOUGH = 0.1; float sine(float x) { if (abs(x) <= SMALL_ENOUGH) { return x; } return p(sine(x / 3.0)); } float cube(float x) { return x * x * x; } float p(float x) { loop++; return 3 * x - 4 * cube(x); } void main() { loop = 0; float x = 1.215; float ret = sine(x); writefln("sine(%f) = %f, loop = %d", x, ret, loop); loop = 0; x = 12.15; ret = sine(x); writefln("sine(%f) = %f, loop = %d", x, ret, loop); loop = 0; x = 121.5; ret = sine(x); writefln("sine(%f) = %f, loop = %d", x, ret, loop); loop = 0; x = 1215; ret = sine(x); writefln("sine(%f) = %f, loop = %d", x, ret, loop); loop = 0; x = 12150; ret = sine(x); writefln("sine(%f) = %f, loop = %d", x, ret, loop); loop = 0; x = 121500; ret = sine(x); writefln("sine(%f) = %f, loop = %d", x, ret, loop); }
実行結果:
uprush@uprush-dev:~/src/d/sicp$ ./q1_15
sine(1.215000) = 0.937512, loop = 3
sine(12.150000) = -0.399804, loop = 5
sine(121.500000) = 0.818955, loop = 7
sine(1215.000000) = 0.023834, loop = 9
sine(12150.000000) = 0.999932, loop = 11
sine(121500.000000) = 0.539522, loop = 13 |
空間コストは O(1) でしょう。時間コストは log3(a) でしょう。
|