Fun with math: Dividing one by 998001 yields a surprising result
iheartchaos.com
iheartchaos.com
http://www.futilitycloset.com/2012/01/08/math-notes-76/
Here's the math. Suppose you want a unit fraction 1/n with decimals that cycle through the 4-digit sequence abcd. Multiply by 10^4 to shift abcd into integer position, leaving repeating copies after the decimal point:
10^4/n = abcd + 1/n
Solving for n gives n = (10^4 - 1) / abcd.More generally, if you want to get a cycle equal to the d digits of an integer k, you want n = (10^d - 1) / k.
However, this only gives a true unit fraction when k divides 10^d - 1, so that n is an integer. Otherwise you are forced to truncate n and getting an approximate version of the cycle.
That's exactly what happened here: 10^d - 1 is not divisible by the integer 001002...998999.
Here's a small Python program that will generate the unit fraction given the number of digits to cycle through:
import sys
n = int(sys.argv[1])
s = ''.join(("%0" + str(n) + "d") % (i,) for i in range(10**n))
print "1/%d" % ((10**len(s) - 1) / int(s),)
Usage: $ python magic.py 3
1/998001
$ python magic.py 4
1/99980001
This has just the right flavor for a Project Euler problem. xy = b((x - b/2) + (y - b/2)) + (b - x)(b - y)
For b = 2 in particular, x - b/2 and x - b/2 are the negative 1's complements of x and y, and b - x and b - y are the 2's complements. More generally, they are the same kinds of complements generalized to base b.Because of that symmetric relationship with complementation, I suspect there is a conceptual proof waiting to be found. By conceptual I mean something that isn't just blind formula crunching. That would get us much closer to "why".
0.00
+ 0.0001
+ 0.000002
+ 0.00000003
...
--------------
Each row is equal to x, but shifted over 2x digits. This is the same as dividing by 10^x. This simplifies to the formula: sum k=0 to infinity: k/(10^k)
This is fairly easily calculable, and results in 1/9801. Try it yourself on wolfram alpha: http://www.wolframalpha.com/input/?i=%28sum_%28k%3D1%29%5Ein...1/(b-1)^2 = 0.0123456... (where '1', '2'.. are base b digits).
The original post is this fact in base 1000.
Proof for any base: 1/(b-1) = 1/b + 1/b^2 + 1/b^3 + .. = 0.11111.. (base b).
So 1/(b-1)^2 = 0.11111.. * (1/b + 1/b^2 + 1/b^3 + ...) = 0.012345... QED.
Richard Feynman beat us all to the punch here by noticing that 1/243 = 0.004115226337..., a fact which he wrote in a letter from a secret lab to someone in the outside world, and which put him under suspicion of sending secret messages! That gem of a fraction turns out to be a result of the above stuff as 1/243 = 111 * (1/999^2) + 4/999.
Here's a slightly more detailed explanation:
import decimal
decimal.getcontext().prec=1000
dec = decimal.Decimal(1)/decimal.Decimal(998001)
#now doctor it up to see the numbers
strdec = str(dec)[2:] #chop off the '0.'
nums = zip(strdec[::3],strdec[1::3],strdec[2::3])
print numsEDIT: Um... I answered the good man's question. Could someone explain why this correct answer was voted down so I may improve it? I recognize that it is short, but that's really all there is too it. It's a decimal expansion, not a border collie.
Don't really have time to think about this, but you can sort of generate the sum (ie by looking at the pattern) with
(1/1000) * sum i * 1000^-i , i = 0 to infinity
You could try and do a sum of a sum of geometric series and make it work
http://www.wolframalpha.com/input/?i=sum+i+*+1000%5E-i%2C+i%...
(998001 / 2997 = 3)
It's not that people here are stuffy, or humorless, or anything; we just want HN to be different, and not decay into a festering cesspool of malfeasance like Slashdot or whatever. There are plenty of places one can go to get that kind of stuff on the 'net. Here at HN, it will usually be downvoted mercilessly.
I had to re-read what the parent poster said to get it. So I thought I'd explain what he means when he says:
> Also, "998" doesn't appear 'in sequence' (it obviously appears as 97[9 98]0 981).
He is saying 998 is missing, as others have observed. He is also saying that if you took the string of digits and did a string search for "998", you'd obviously find those digits together in other places (specifically during the sequence of 979 980 981).
You'd also find them at 799 800 801.
require 'bigdecimal'; BigDecimal.new(1).div(998001, 2997)
Basically, the pattern is 1 over some number of 9s, followed by an 8, followed by the same number of 0s, followed by a 1.
So, 1/81, 1/9801, 1/998001, 1/99980001, 1/9999800001, etc.
For example, 1/9999/99 = 1/989901 = .00 00 01 01 02 02 03 03 ... 97 97 98 99 00 00 01 01 ...
1/999/9 = 1/8991 = .000 111 222 333 444 555 666 777 889 repeating.
Can anyone explain why it repeats in this way, or link to a place that has an explanation?
1---------
If x = 0.001 then the sum x^2 + 2x^3 + 3x^4…. in its decimal places will have all the three digit numbers except the the second last starting with 000,001 and then till 997,999.
As pointed out by someone below,the reason 998 is missing is because after 997998999 the next coefficient is 1000.This overflow 1 will carry over and mess up all the nines to the right until it hits the eight at which point it will make it a 9.Therefore the series will become 997999000001002003... as subsequent overflows keep messing up the last digit to the left.During the addition of the 2000th term a similar thing will happen and the series at that location will become ...997999001002003...... and it will keep losing a term from the beginning in the subsequent 998 repetitions.
More generally if x = 10^-n,n>0 then the sum x^2 + 2x^3 + 3x^4 will have all the n digit numbers starting with (n-zeroes),(n-1 zeroes 1)…except the second last (10^n-2).
2---------
From http://en.wikipedia.org/wiki/Geometric_series
An infinite geometric series converges to a/(1-r) if and only if the absolute value of r is less than 1.
a + ar^2 + ar^3 .... = a/(1-r) if |r|<1 -------> [1]
3---------
1 + 2x + 3x^2.....
= (1) + (x+x) + (x^2+x^2+x^2)....
= (1+x+x^2...) + (x+x^2+x^3...) + ...
= 1/(1-x) + x/(1-x) + (x^2)/(1-x) + .... since x < 1 from [1]
= (1+x+x^2....)/(1-x)
= 1/(1-x)^2 since x < 1 from [1] ---------> [2]
4---------
So the number 0.000001002003004……997999000001002003....
= (x^2 + 2x^3 + 3x^4…..) , x = 0.001
= (x^2) * (1 + 2x + 3x^2 …..)
= (x^2)/((1-x)^2)
= (0.001)^2/(0.999)^2
= ((1/999))^2
= 1/998001
More generally the sum which has all the n digit numbers except (10^n-2) in its decimal places is given by (10^n-1)^(-2).
1 + r + r^2 + ... = 1/(1-r)
Differentiate both sides of the equation: 1 + 2r + 3r^2 + ... = 1/(1-r)^2
Here's a bijective combinatorial proof, which I like best of all. It uses the concept of generating functions. As a caveat, it only shows the equality for formal power series, not analytic power series.The series 1 + r + r^2 + ... = 1/(1-r) is the type of tuples with entries in r. Then 1/(1-r)^2 is the type of pairs of tuples (the tuples in a pair need not have the same length). A pair of tuples can be mapped to a single tuple by concatenation. Conversely, a single tuple can be split into a pair of tuples. How many ways can this splitting be done if the tuple has length n? In n+1 ways; for example, the 2-tuple (a,b) can be split into the 3 pairs of tuples ((a,b), ()), ((a), (b)) and ((), (a, b)), which are exactly the pairs that concatenate to (a,b). Thus the bijection from 1 + 2r + ... + (n+1) r^n + ... to 1/(1-r)^2 maps an element of (n+1) r^n, which is an index 0 <= k <= n and an n-tuple, to the pair of tuples gotten from splitting that n-tuple at index k.
EDIT 1: Forgive my ignorance but can you please elaborate on
1 + r + r^2 + ... = 1/(1-r) is the type of tuples with entries in r ?
EDIT 2: Okay I think I get it.
1 + r + r2 are the terms in the expansion of (1+r)n
> >1 + r + r^2 + ... = 1/(1-r) is the type of tuples with entries in r ?
r^n is the type of n-tuples with entries in r. When you sum over all n, you get the type of tuples of any length with entries in r.
One thing that might be confusing you is that I'm thinking of r itself as a type, not as a number. You get a number from a type by counting its elements, but a type has much more structure than just its size.
Let's warm up with a probabilistic proof of
1 + p + p^2 + ... = 1/(1-p)
in the form (1-p)(1 + p + p^2 + ...) = 1
This says that if you have a Bernoulli process with failure probability p and success probability 1-p, you will eventually succeed with probability 1. Indeed, (1-p) p^n is the probability that you will succeed after n failures.To see this is true (it is certainly intuitively plausible), note that the probability of taking longer than n tries is p^n, which goes to zero as n goes to infinity.
We can apply the same kind of reasoning to
(1-p)^2 (1 + 2p + 3p^2 + ...) = 1
As before, we have a process with failure probability p and success probability p-1. However, rather than stopping after the first success, we will continue until we have two successes. Now take a look at the terms of the equation's left-hand side: (1-p)^2 (n+1) p^n
This is the probability that we will have gotten 2 successes (and hence n failures) after n+2 steps. The second success must always be the final trial, so there are n+1 possible positions for the first success. That explains the factor of n+1.With that understood, the equation simply says that we will eventually get 2 successes with probability 1. To see why, note that the probability of never getting any successes in n tries is p^n as before, which tends to zero. So we will eventually get at least one success with probability 1. But once we have that first success, getting the second success is just our first problem repeated, so we know that happens eventually with probability 1.
This proof technique generalizes easily. If we keep trying until we have 3 successes, we get a factor of C(n+2, 2) = (n+2)(n+1)/2 for the number of ways the first 2 successes can be placed before the third and final success when there are n failures and 3 successes. We show that a first success occurs eventually with probability 1 as before, which reduces the problem to getting two subsequent successes, a problem we already solved.
You can see this yields a proof by induction for this whole class of series identities, but it's not of those unenlightening proofs by induction that shows you something is true but does not tell you why.
x + 2x^2 + 3x^3 + 4x^2..
=
x + x^2 + x^3 + x^4 + ...
+ x^2 + x^3 + x^4 + ...
+ x^3 + x^4 + ...
+ x^4 + ...
= sum i from 0 to infinity (sum j=i to infinity (x^j))
= sum i from 0 to infinity ((x^i)/(1-x))
= 1/(1-x)^2 ;Here is my version in Common Lisp
;Supply your own flatten function
;or borrow one from let-over-lambda or something
;http://letoverlambda.com/lol.lisp
(defun long-div (dividend divisor depth)
(cond
((> depth 0)
(flatten (list
(truncate (/ dividend divisor))
(long-div (* 10 (mod dividend divisor))
divisor (- depth 1)))))
(t ()))) ... 995 996 997 999 ... 95 96 97 99 00 01 02 ...
And extrapolating it to one digit, 1/81 gives 0.012345679012345679...Another way to get the real consecutive numbers is to make a rest so we avoid that annoying increment at the end:
1/998001 - 1e-1000
def long_div(x,y,N=10):
"""Given two integers x and y, return us the N digits of x/y."""
#First work out the integer part
x = int(x)
divisor = y = int(y)
quotients = [x/y]
dividend = x % y
for digit in range(N):
dividend *= 10
quotient = dividend/divisor
dividend = dividend%divisor
quotients.append(quotient)
return quotients
def pretty_print(quotients, G=3):
"""Pretty print quotients by grouping digits by 3."""
strp = ''
cnt = 1
for n in quotients[1:]:
strp += str(n)
cnt +=1
if cnt > G:
print strp
strp = ''
cnt = 1
quotients = long_div(1,998001,N=3000)
pretty_print(quotients,G=3)http://people.csail.mit.edu/devadas/numerics_demo/chord.html
For an explanation better than I can provide of what they are and how it works, see 6.006 lecture 11 notes!
http://courses.csail.mit.edu/6.006/fall11/lectures/lecture11...
12345679 * 9 = 111111111
12345679 * 18 = 222222222
12345679 * 27 = 333333333
12345679 * 36 = 444444444
12345679 * 45 = 555555555
12345679 * 54 = 666666666
12345679 * 63 = 777777777
12345679 * 72 = 888888888
12345679 * 81 = 999999999
12345679 * 999999999 = 12345678987654321
Also, pick any three-digit number, multiply by 7, 11, and 13 (or 1001), and you get your three-digit number repeated twice.
Love the trick with how this can be done via differentiating the equation:
1 + r + r^2 + ... = 1/(1-r)
http://www.math.ucsb.edu/~agboola/teaching/2005/winter/old-1...
double x = 0.1;
and get something that works.That's taking things a bit far, isn't it? Sure, you can't exactly express 0.1 as a double - but you can get many things that work really well using the approximation.
There's a special place in hell for business owners who inflict Websense or any other method of censoring content on their own employees.
If you don't trust me to use it, don't give me a computer, or an internet connection.
Your work computer and Internet access is governed by a policy that all employees have to sign. Among other things, this policy says that your time at work is supposed to be used doing work-related things. The only way to enforce this policy is to filter out things that are not business-related. This policy at many companies is usually pretty lax and ad-hoc, really only blocking categories of sites, not individual sites themselves. The categories usually include pornography/extreme content, games, etc.
Other categories are blocked due to the fear of data leakage. Google Docs/Dropbox is common for this. The last thing you want your employees doing is putting sensitive information onto the Internet where competitors or ill-wishers can view them. The goal here is to make it more difficult to share, not impossible (knowing that email/removable media is still an option).
We want you to do your work. We understand there are times when you need Internet access. But no, we don't trust you, because you're on Hacker News right now (as am I). If the world were a better place, we could trust the security of the company to the users/employees. You and I both know this isn't true. While you're at work, your company owns your time under the terms of your contract. It's not censorship because private organizations have no responsibility to ensure your freedoms.
TL;DR try complaining to your CIO that you can't get to iheartchaos.com. S/He'll tell you to get back to work.
The .001 repeating = 1/999, simplify, voila.
2. Choosing a suitable dividend
3. Calculate quotient
4. Instant interesting observation!
:)