exp(pi * sqrt(n))が整数に近くなるnを探す
Posted feedbacks - C
GNU拡張使用。 精度の問題か163はひっかからず。 実行結果は 37 199148647.999978 58 24591257752.000000 67 147197952743.999999
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <stdio.h>
#define __USE_GNU
#include <math.h>
void func(int n)
{
long double d;
int n_normal, n_plus, n_minus;
/* exp(pi * sqrt(n)) を求める */
d = expl(M_PIl * sqrtl((double)n));
/* 精度倍する。1を加減算して桁上がりするか */
n_normal = fmodl(d*10000.0, 10000.0);
n_plus = n_normal + 1;
n_minus = n_normal - 1;
if ((n_normal % 10000) == 0
|| (n_plus % 10000) == 0
|| (n_minus % 10000) == 0) {
printf("%d %Lf\n", n, d);
}
}
int main()
{
int n;
for (n = 1; n < 200; n++) {
func(n);
}
return 0;
}
|
人のふんどしで相撲を取るシリーズ。 上記のコードを任意精度演算ライブラリとしてgmpを使いCに移植しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gmp.h>
mpf_t curr, next, bunsi, bunbo;
void mpf_exp(mpf_t x)
{
unsigned int k;
mpf_set_ui(curr, 1.0);
mpf_set_ui(bunsi, 1.0);
mpf_set_ui(bunbo, 1.0);
for (k = 1; ;k++) {
mpf_mul(bunsi, bunsi, x);
mpf_mul_ui(bunbo, bunbo, k);
mpf_div(next, bunsi, bunbo);
mpf_add(next, next, curr);
if (mpf_cmp(curr, next) == 0) {
mpf_set(x, curr);
return;
}
mpf_set(curr, next);
}
}
int main(int argc, char *argv[])
{
char buf[128], tmp[8];
double d;
int i;
mpf_t x, pi;
mpf_set_default_prec(128);
mpf_init(curr);
mpf_init(next);
mpf_init(bunsi);
mpf_init(bunbo);
mpf_init(x);
mpf_init(pi);
mpf_set_str(pi, "3.1415926535897932384626433832795029", 10);
for (i = 1; i < 200; i++) {
mpf_set_ui(x, i);
mpf_sqrt(x, x);
mpf_mul(x, x, pi);
mpf_exp(x);
gmp_sprintf(buf, "%.*Ff", 6, x);
d = atof(strncpy(tmp, strchr(buf, '.'), 7));
if ((d < 0.0001) || ((1 - d) < 0.0001))
printf("%d %s\n", i, buf);
}
mpf_clear(curr);
mpf_clear(next);
mpf_clear(bunsi);
mpf_clear(bunbo);
mpf_clear(x);
mpf_clear(pi);
return 0;
}
|




herumi
#3416()
Rating0/2=0.00
Pythonで34行のスクリプトを書いて得られた出力の例が下のようになります。
この問題は光成さんに教えて頂いた e^{π*sqrt{163}}≒26253741640768744 が元になっています。ご協力ありがとうございました。[ reply ]