《Site Map》
:HOME  > Who am I  > 下呂数

下呂数

2015年第57回プログラミング・シンポジウム予稿集

下呂数は、2015年の夏のプログラミング・シンポジウムで竹内先生が出題されたものです。⇒竹内先生の記事 例)
2 = 0+2
3 = 0+3
4 = 0+2+2、0+2*2
5 = 0+2+3、0+3+2
6 = 0+2*3、0+3*2、0+3+3 (0+2+2+2は、長いのでダメ)
7 = 0+2+2+3、0+2*2+3、0+2+3+2、0+3+2+2
8 = 0+2+2*2、0+2*2*2、0+2+3+3、0+3+2+3、0+2*2+2、0+3*2+2、0+3+3+2
9 = 0+3*3

拡張下呂数

ある自然数nについて、拡張下呂数 g(n) を考える。先頭の「0」は表示しない。
g(1) = {  }
g(2) = { +2 }
g(3) = { +3 }
g(n) = g(n-2)+2 if n > 3、
 or  g(n-3)+3 if n > 4、
 or  g(n/2)*2 if n > 3 and n mod 2 = 0、
 or  g(n/3)*3 if n > 5 and n mod 3 = 0
例)
g(6) = g(4)+2、g(3)+3、g(3)*2、g(2)*3
   = { +2+2+2、+2*2+2、+3+3、+3*2、+2*3 }
また、位数(長さ)を限定した拡張下呂数 g(n, i) を考える。
g(6, 2) = { +3+3、+3*2、+2*3 }
g(6, 3) = { +2+2+2、+2*2+2 }
g(n, i) で、空でない最小の i を gi(n) とする。また、g(n, gi(n)) の要素の個数を gc(n) とする。
ngi(n)gc(n)g(n)
1-0
211+2
311+3
422+2+2, +2*2
522+3+2, +2+3
623+3+3, +3*2, +2*3
+2+2+2, +2*2+2
734+3+2+2, +2+3+2, +2+2+3, +2*2+3
837+3+3+2, +3*2+2, +2*3+2, +3+2+3, +2+3+3, +2+2*2, +2*2*2
+2+2+2+2, +2*2+2+2
921+3*3
+3+3+3, +3*2+3, +2*3+3
+3+2+2+2, +2+3+2+2, +2+2+3+2, +2*2+3+2, +2+2+2+3, +2*2+2+3

位数 iming(min, gi(min))maxg(max, gi(max))
12+23+3
242+2 2*293*3
375+2 4+3279*3
41311+2 10+38127*3
51917+2 16+324381*3
63735+2 34+3729243*3
75553+2 52+32187729*3
8109107+2 106+365612187*3
9199197+2 196+3196836561*3
10325323+2 322+35904919683*3
11631629+2 628+317714759049*3
12973971+2 970+3531441177147*3
1319431941+2 1940+31594323531441*3
1433493347+2 3346+347829691594323*3
1561576155+2 6154+3143489074782969*3
161004510043+2 10042+34304672114348907*3
171944119439+2 19438+312914016343046721*3
183499334991+2 34990+3387420489129140163*3
196998369981+2 69980+31162261467387420489*3
20108865108863+2 108862+3
21213841213839+2 213838+3
22326593326591+2 326590+3
23641521641519+2 641518+3
2412597131259711+2 1259710+3
2522394892239487+2 2239486+3
2638957773895775+2 3895774+3
2767184656718463+2 6718462+3
281231718512317183+2 12317182+3
292015539320155391+2 20155390+3
303695155336951551+2 36951550+3
316046617760466175+2 60466174+3
32120932351120932349+2 120932348+3
33181398529181398527+2 181398526+3
34362797055362797053+2 362797052+3
35725594077725594075+2 725594074+3
3615032563211503256319+2 1503256318+3
372176782337
384642458625
396530347009
4015237476353
4127088846849
4253935828993
4381266540545

max = 3i(たぶん確定)

では、2のべきは? ⇒ gi(8192) = 12、+3*3+2*3*3+2*3*3*3+3*3+2 があるので、gi(2i) ≠ i

⇒予想:min ~ 2*10(i-1)/4

min は、‘6の倍数+1’ではありません! e.g. 1943(13), 69983(19), 120932351(32), 362797055(34),
赤線は近似曲線緑線は2*10(i-1)/4


⇒予想:gc(n)/n < 0.4‥‥×。大きな n では、もっと小くなる!

範囲gc(n)/n の最大値ngi(n)gc(n)g(n)
1-90.8758376+2 5+3 4*2
10-990.7857142857142861441112+2 11+3 7*2
100-9990.61744966442953149892147+2 146+3
1000-99990.4865329512893981745128491743+2 1742+3
10000-999990.3755837224816541049315394110491+2 10490+3
100000-9999990.2976297003719772492092074172249207+2 249206+3
1000000-99999990.1908865123087461493369222850641493367+2 1493366+3
10000000-999999990.1138605696679961351506526153883313515063+2 13515062+3
100000000-9999999990.0809666294772565107547641298707770107547639+2 107547638+3
1000000000-20000000000.0461755708861733128999730532595663621289997303+2 1289997302+3
範囲gc(n)/n の最大値ngi(n)gc(n)g(n)
2-30.5211+2
4-70.5714285714285717345+2 4+3
8-150.8758376+2 5+3 4*2
16-310.6153846153846152651624+2 13*2
32-630.5609756097560984162339+2 38+3
64-1270.610389610389617774775+2 74+3
128-2550.61744966442953149892147+2 146+3
256-5110.5529010238907852939162291+2 290+3
512-10230.51759364358683388111456879+2 878+3
1024-20470.4865329512893981745128491743+2 1742+3
2048-40950.43334293118341534731315053471+2 3470+3
4096-81910.37257487285741253091419785307+2 5306+3
8192-163830.3755837224816541049315394110491+2 10490+3
16384-327670.37251040310028331481171172731479+2 31478+3
32768-655350.36556682911240762585182287962583+2 62582+3
65536-1310710.25398908946398783039182109183037+2 83036+3
131072-2621430.2976297003719772492092074172249207+2 249206+3
262144-5242870.2587000569014883321532185928332151+2 332150+3
524288-10485750.21253948127727274687321158740746871+2 746870+3
1048576-20971510.1908865123087461493369222850641493367+2 1493366+3
2097152-41943030.1648072687796282986361234921742986359+2 2986358+3
4194304-83886070.1371673940470625972345248192115972343+2 5972342+3
8388608-167772150.12263782676434489583292410986308958327+2 8958326+3
16777216-335544310.1070445925691831791628125191784117916279+2 17916278+3
33554432-671088630.08854323198585025405912928478657054059127+2 54059126+3
67108864-1342177270.0809666294772565107547641298707770107547639+2 107547638+3
134217728-2684354550.07183471366537672150430653015447557215043063+2 215043062+3
268435456-5368709110.06120063605309194300339133126318349430033911+2 430033910+3
536870912-10737418230.05154482743957796450247613133247690645024759+2 645024758+3
1073741824-20000000000.0461755708861733128999730532595663621289997303+2 1289997302+3

n	gi(n)	gc(n)	g(n,gi(n))
2	1	1	+2
3	1	1	+3
4	2	2	2+2 2*2
5	2	2	3+2 2+3
6	2	3	3+3 3*2 2*3
7	3	4	5+2 4+3
8	3	7	6+2 5+3 4*2
9	2	1	3*3
10	3	2	5*2
	・
	・
	・
2141187644	30	338	2141187642+2
2141187645	30	338	2141187642+3
2141187646	31	576	2141187644+2 1070593823*2
2141187647	31	676	2141187645+2 2141187644+3
2141187648	30	744	1070593824*2 713729216*3
2141187649	32	1252	2141187647+2 2141187646+3
2141187650	31	744	2141187648+2
2141187651	30	676	713729217*3
2141187652	31	348	1070593826*2
2141187653	31	676	2141187651+2
	・
	・
	・
134390579292    35
134390579293    38
134390579294    36
134390579295    36
134390579296    36
134390579297    37
134390579298    36
134390579299    37
134390579300    37
134326599670	37

プログラムの例
#include <stdio.h>

#define	MAX	2141187654

unsigned char g[MAX];
unsigned long c[MAX];

int main(int argc, char*argv[])
{
	unsigned long i;

	g[2] = 1; c[2] = 1; g[3] = 1; c[3] = 1;
	printf("n\tgi(n)\tgc(n)\tg(n,gi(n))\n2\t1\t1\t+2\n3\t1\t1\t+3\n");

	for(i = 4; i < MAX; i++) {
		int gi = g[i-2]+1, cc = 1; char *s = "";
		if(i > 4) {
			if(g[i-3]+1 < gi) {
				gi = g[i-3]+1; cc = 2;
			} else if(g[i-3]+1 == gi) {
				cc = 3;
			}
		}
		if(i % 2 == 0) {
			if(g[i/2]+1 < gi) {
				gi = g[i/2]+1; cc = 4;
			} else if(g[i/2]+1 == gi) {
				cc |= 4;
			}
		}
		if(i % 3 == 0) {
			if(g[i/3]+1 < gi) {
				gi = g[i/3]+1; cc = 8;
			} else if(g[i/3]+1 == gi) {
				cc |= 8;
			}
		}
		g[i] = gi; long gc = 0;
		if(cc & 1) { gc += c[i-2]; }
		if(cc & 2) { gc += c[i-3]; }
		if(cc & 4) { gc += c[i/2]; }
		if(cc & 8) { gc += c[i/3]; }
		c[i] = gc;
		printf("%lu\t%d\t%lu\t", i, gi, c[i]);
		if(cc & 1) { printf("%ld+2", i-2); s = " "; }
		if(cc & 2) { printf("%s%ld+3", s, i-3); s = " "; }
		if(cc & 4) { printf("%s%ld*2", s, i/2); s = " "; }
		if(cc & 8) { printf("%s%ld*3", s, i/3); }
		printf("\n");
	}
}