Counting fractions in a range
Problem 073: Counting fractions in a range
Consider the fraction, n/d
, where n and d are positive integers. If n<d
and HCF(n,d)=1
, it is called a reduced proper fraction.
If we list the set of reduced proper fractions for d <= 8
in ascending order of size, we get:
1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8
It can be seen that there are 3 fractions between 1/3
and 1/2
.
How many fractions lie between 1/3
and 1/2
in the sorted set of reduced proper fractions for d <= 12,000
?
Solution:
XX ????
# ... #
. . . .
. . .
. . . .
# ... #
>"}`"*11p051p0v
vp12*"(2" < v+1 < <
>1+:1+2/61p:71p:3/1+>:61g\`!#v_:21g%71g3+g!|>81g11g`91g11g`+#^_081g21gv
|-g11: >#$ #< ^p19+g19g17p18+g18:p+3g19%<
>$51g.@ ^p19g17p18:p15+1g15<
Explanation:
Here we brute-force through every possible denominator d
(from 1 to 12000).
For every denominator the valid numerators are between floor(d/3)
and ceil(d/2)
.
The only problem is that we don't know if a fraction is proper.
To solve this we use a 12000x12000
array where we mark the already found fractions and every multiple of them.
When we now find a new one we can test if we have already found the fraction (in a reduced form).
But a 12000x12000
array is quite big, the resulting b93-file was 140MB big.
But we know that most of the array will never be accessed,
only the columns between d/3
and d/2
are important and the biggest range is in the last row (LIMIT/3 - LIMIT/2
).
So in each array-acess we modulo the x coordinate by LIMIT/3 - LIMIT/2
(= 2000
).
Now our array has only a size of 12000x2000
and the befunge-file is only 23MB big.
The program is not that fast, but that's mostly because of it's raw size, the algorithm is quite good (200ms
when I implement it in C#)
Interpreter steps: | 1 281 174 401 |
Execution time (BefunExec): | 3min 22s (6.33 MHz) |
Program size: | 2000 x 12010 |
Solution: | 7295372 |
Solved at: | 2015-08-21 |