Needless to say, but I'll say it anyway, a fascinating problem. Exactly the kind of thing that my Dad eats for breakfast (retired actuary and all that).
After some thought, it seems clear that this is a tough nut to crack. If you start with a sorted list of factors, largest to smallest, and multiply values together, the solution is 25. If you drop the first value, you end up with 20. I can't prove it (not at 0630, anyway), but I expect there are cases where the solution is the product of the first, second and last factors.
In the end, I think the best way to find out the answer is to figure out the integer that's closest to the square root, then go backwards to find the largest number made up of the factors. Assuming you don't want to actually calculate the suqare root, the first part of that can be a straightforward binary search. The second part is where it gets interesting .. you have to find the combination of factors whose product is closest to the approximate square root value you've determined.
And that sounds an awful lot like re-starting the original problem. Ugh.
Alex / talexb / Toronto
"Groklaw is the open-source mentality applied to legal research" ~ Linus Torvalds
| [reply] |
| [reply] [d/l] [select] |
If you haven't already installed Math::Pari for doing your factorisation, do so now. I knew it would be quicker than Math::Big, but you have to see for yourself how much faster it is to believe it. It's not just the C -v- Perl difference, it has a batch of extremely clever algorithms in there, and intelligently chooses the most appropriate one.
The only bug-bear I have with Math::Pari so far, is the lack of a (as far as I can see), function for flattening its two dimensional vectors. The results from factorint() come back as an AoA, where the first nested array conatins the factors, and the second contains the counts, which makes them a tad awkward to maniulate.
Examine what is said, not who speaks.
Silence betokens consent.
Love the truth but pardon error.
| [reply] |