%I #55 Nov 15 2018 10:52:59
%S 1,1,1,1,2,1,1,2,2,1,1,2,3,2,1,1,2,3,3,2,1,1,2,3,4,3,2,1,1,2,3,4,4,3,
%T 2,1,1,2,3,4,5,4,3,2,1,10,2,3,4,5,5,4,3,2,10,11,10,3,4,5,6,5,4,3,10,
%U 11,11,11,10,4,5,6,6,5,4,10,11,11,11,12,11,10,5,6,7,6,5,10,11,12,11,11,12,12
%N Array T(n,k) = lunar product n*k (n >= 1, k >= 1) read by antidiagonals.
%C See A087061 for definition. Note that 0+x = x and 9*x = x for all x.
%C This differs from A003983 at a(46): min(1,10)=1, while lunar product 10*1 = 10.
%C We have now changed the name from "dismal arithmetic" to "lunar arithmetic" - the old name was too depressing. - _N. J. A. Sloane_, Aug 06 2014
%H Alois P. Heinz, <a href="/A087062/b087062.txt">Table of n, a(n) for n = 1..10011</a>
%H D. Applegate, <a href="/A087061/a087061.txt">C program for lunar arithmetic and number theory</a>
%H D. Applegate, M. LeBrun and N. J. A. Sloane, <a href="http://arxiv.org/abs/1107.1130">Dismal Arithmetic</a>, arXiv:1107.1130 [math.NT], 2011.
%H Brady Haran and N. J. A. Sloane, <a href="https://youtu.be/cZkGeR9CWbk">Primes on the Moon (Lunar Arithmetic)</a>, Numberphile video, Nov 2018.
%H <a href="/index/Di#dismal">Index entries for sequences related to dismal (or lunar) arithmetic</a>
%e Lunar multiplication table begins:
%e 1 1 1 1 1 ...
%e 1 2 2 2 2 ...
%e 1 2 3 3 3 ...
%e 1 2 3 4 4 ...
%e 1 2 3 4 5 ...
%p # convert decimal to string: rec := proc(n) local t0,t1,e,l; if n <= 0 then RETURN([[0],1]); fi; t0 := n mod 10; t1 := (n-t0)/10; e := [t0]; l := 1; while t1 <> 0 do t0 := t1 mod 10; t1 := (t1-t0)/10; l := l+1; e := [op(e),t0]; od; RETURN([e,l]); end;
%p # convert string to decimal: cer := proc(ep) local i,e,l,t1; e := ep[1]; l := ep[2]; t1 := 0; if l <= 0 then RETURN(t1); fi; for i from 1 to l do t1 := t1+10^(i-1)*e[i]; od; RETURN(t1); end;
%p # lunar addition: dadd := proc(m,n) local i,r1,r2,e1,e2,l1,l2,l,l3,t0; r1 := rec(m); r2 := rec(n); e1 := r1[1]; e2 := r2[1]; l1 := r1[2]; l2 := r2[2]; l := max(l1,l2); l3 := min(l1,l2); t0 := array(1..l); for i from 1 to l3 do t0[i] := max(e1[i],e2[i]); od; if l>l3 then for i from l3+1 to l do if l1>l2 then t0[i] := e1[i]; else t0[i] := e2[i]; fi; od; fi; cer([t0,l]); end;
%p # lunar multiplication: dmul := proc(m,n) local k,i,j,r1,r2,e1,e2,l1,l2,l,t0; r1 := rec(m); r2 := rec(n); e1 := r1[1]; e2 := r2[1]; l1 := r1[2]; l2 := r2[2]; l := l1+l2-1; t0 := array(1..l); for i from 1 to l do t0[i] := 0; od; for i from 1 to l2 do for j from 1 to l1 do k := min(e2[i],e1[j]); t0[i+j-1] := max(t0[i+j-1],k); od; od; cer([t0,l]); end;
%t ladd[x_, y_] := FromDigits[MapThread[Max, IntegerDigits[#, 10, Max@IntegerLength[{x, y}]] & /@ {x, y}]];
%t lmult[x_, y_] := Fold[ladd, 0, Table[10^i, {i, IntegerLength[y] - 1, 0, -1}]*FromDigits /@ Transpose@Partition[Min[##] & @@@ Tuples[IntegerDigits[{x, y}]], IntegerLength[y]]];
%t Flatten[Table[lmult[k, n - k + 1], {n, 1, 13}, {k, 1, n}]] (* _Davin Park_, Oct 06 2016 *)
%o (Python)
%o def lunar_add(n,m):
%o sn, sm = str(n), str(m)
%o l = max(len(sn),len(sm))
%o return int(''.join(max(i,j) for i,j in zip(sn.rjust(l,'0'),sm.rjust(l,'0'))))
%o def lunar_mul(n,m):
%o sn, sm, y = str(n), str(m), 0
%o for i in range(len(sm)):
%o c = sm[-i-1]
%o y = lunar_add(y,int(''.join(min(j,c) for j in sn))*10**i)
%o return y # _Chai Wah Wu_, Sep 06 2015
%o (PARI) lmul=A087062(m,n,d(n)=Vecrev(digits(n)))={sum(i=1,#(n=d(n))-1+#m=d(m), vecmax(vector(min(i,#n),j,if(#m>i-j,min(n[j],m[i-j+1]))))*10^i)\10} \\ _M. F. Hasler_, Nov 13 2017
%Y Cf. A087061 (addition), A003983 (min), A087097 (lunar primes).
%Y See A261684 for a version that includes the zero row and column.
%K nonn,tabl,nice,base,look
%O 1,5
%A _Marc LeBrun_, Oct 09 2003
%E Maple programs from _N. J. A. Sloane_.
%E Incorrect comment and Mathematica program removed by _David Applegate_, Jan 03 2012
%E Edited by _M. F. Hasler_, Nov 13 2017