20190301, 16:01  #1 
"Mike"
Aug 2002
7709_{10} Posts 
March 2019

20190301, 16:11  #2 
Jan 2017
79 Posts 
The "bonus question" part seems badly thought out. It seems to assume a particular value for n1. But the requirement is symmetrical for n1 and n2, and for the question to not be completely trivial, n1 and n2 must be different numbers (though that's not quite spelled out in the question). So even if there is a "simplest" answer, you can at least exchange n1 and n2.
And there actually are infinitely many possible answers. There only finitely many possible combinations of values for (BAT(x, N1), BAT(x, N2)). Thus infinitely many primes have the same combination, and thus there are infinitely many possible answers. I doubt all of those have some meaningful connection between BAT(sqrt(n1), 10000) and IBM. 
20190304, 22:55  #3 
Jan 2017
79 Posts 
The question has been updated to clarify that it's the BAT values that must be primes, not the answer numbers. It's still true that there are infinitely many possible answers.

20190403, 13:47  #4 
"Mike"
Aug 2002
13·593 Posts 

20190404, 06:37  #5 
Oct 2017
97_{10} Posts 
solution
The solution is containing a little error: N2 = 1.76E10 and not 1.76E9

20190404, 07:13  #6 
Oct 2017
61_{16} Posts 
solution
Searching and checking only numbers ni with BAT((sqrt(ni),10000) = 9100 from the beginning I had found immediately 53 and 477, but my "quadrupleprecision floating point format" codes were not exact enough to compute BAT((sqrt(ni),N1) or BAT((sqrt(ni),N2).
So first of all I had to write routines for the octupleprecision floating point format (4 registers for one floating point number) (236 bits for the mantissa). Then I was able to see that BAT((sqrt(53),N1) = BAT((sqrt(477),N1) and so on. 
20190404, 16:32  #7  
Jan 2017
79 Posts 
Quote:
The code below demonstrates this. Note that it prints all optimal lower and upper bounds, not just optimal approximations. Code:
#!/usr/bin/python3 n = 53 limit = 1e19 k = int(n**.5) assert k**2 != n e = 0 a, d, p = 0, 1, n lb, ub = [0, 1], [1, 0] while lb[1] < limit: print(('lower' if e == 0 else 'upper') + ' bounds:') i = (a+k)//d for _ in range(i): lb[0] += ub[0] lb[1] += ub[1] if lb[1] >= limit: break print(lb[0], '/', lb[1]) a, d, p = i*d  a, p  i*(i*d 2*a), d assert a < (k+1) and d < 2*(k+1) lb, ub, e = ub, lb, 1e Last fiddled with by uau on 20190404 at 17:06 Reason: simplify code 

Thread Tools  
Similar Threads  
Thread  Thread Starter  Forum  Replies  Last Post 
January 2019  Xyzzy  Puzzles  74  20190409 13:34 
March 2018  Xyzzy  Puzzles  2  20180408 13:45 
March 2017  R. Gerbicz  Puzzles  1  20170403 10:57 
March 2016  Xyzzy  Puzzles  21  20160609 20:26 
gmp 4.2 due in March  Mystwalker  GMPECM  4  20060201 12:00 