Building upon the IsPrime function, we now have a means to break a number down into its prime factors.
For example:
12 = 2 * 2 * 3
124 = 2 * 2 * 31
Next step for what I'm working on and playing around with will be fraction simplification.
Take a value like 12 / 16... that can simplify down to 3 / 4. This should now have me on the route to do that easily.
(Break the nominator (top number) down to its prime factors. Check those values against the denominator (bottom number). If they divide evenly (mod = 0) then reduce both numbers by that factor.)
Building upon the IsPrime function, we now have a means to break a number down into its prime factors.
For example:
12 = 2 * 2 * 3
124 = 2 * 2 * 31
Next step for what I'm working on and playing around with will be fraction simplification.
Take a value like 12 / 16... that can simplify down to 3 / 4. This should now have me on the route to do that easily.
(Break the nominator (top number) down to its prime factors. Check those values against the denominator (bottom number). If they divide evenly (mod = 0) then reduce both numbers by that factor.)
Nice! Wish I could do that!
Of all the places on Earth, and all the planets in the Universe, I'd rather live here (Perth, Western Australia.)
Please visit my Website at: http://oldendayskids.blogspot.com/
@SMcNeill
on another forum someone asked about how to factor large integers, say 70 digits in a fast way
suppose that you have big integer type at your disposal, how would you implement a fast factorization program ?
09-22-2024, 12:00 AM (This post was last modified: 09-22-2024, 12:06 AM by Jack.)
thanks Pete, will try it in a while
I found some entries on the Rosetta Code https://rosettacode.org/wiki/Prime_decomposition
I tried the FreeBasic implementation because there's an easy to use GMP header for BigInt and changing the code from integer to BigInt is trivial
but as I was playing with it I found that some integers are easy to factorize while others are hard, for example
factor(314159265358979323846264338327950288419716939937510582097) took less than a second, but
factor(31415926535897932384626433832795028841971693993751058209749) is still running
even the pari/gp calculator took 1.6 seconds
by the way, the factors for the last one are 3, 37, 65665363877655791, 4310131680920695304618177764671198362549
I guess the way I'd have to do such large numbers would be with string math, and then I'd cross my fingers and hope that some of the simplest tricks to math helped reduce those figures down as much as possible.
Is it an even number? End in 2/4/6/8/0? That can be halved and hopefully reduce the work load before you get into the hard crunch.
Can you add up the sum of the digits and evenly divide them by 3?
Does it end in 5?
Three quick and easy tests that you can do without having to worry much about string math, and it resolves a whole boat load of possibilities for you right off the bat. (you simplify all numbers that end with 2/4/5/6/8/0 down really quickly, along with any divisible by 3.)
After that, it's just string math and let it grind until there's no grinding left to do. Hopefully, you have a nice list of primes to go by for as much of that math as possible. After you use up your predefined stuff, the rest is just calculating every value that remains and then it REALLY bogs down in performance.
09-30-2024, 04:36 AM (This post was last modified: 09-30-2024, 05:20 AM by eoredson.)
I wrote a factorialization function here:
Code: (Select All)
Print "Enter range";
Input p: p = Int(p)
If p <= 1 Then End
z = 2
Print " 2= (prime)" ' first prime is 2
Do Until z = p ' display factored numbers
x$ = InKey$
If x$ = Chr$(27) Then
End
End If
z = z + 1
x = z
Print x; "=";
l = 1
q = 0
Do Until x = 1
l = l + 1
Do While x / l = x \ l ' continue to divide number
q = q + 1
If q > 1 Then
Print "*";
End If
Print l;
x = x / l
Loop
If l > Int(z / 2) Then ' test for maximum divisor
Exit Do
End If
If l > Int(Sqr(x)) Then ' test maximum divisor is prime
If q = 0 Then
Exit Do
End If
End If
Loop
If q = 0 Then ' display number is prime
Print " (prime)";
End If
Print
Loop
thanks eoredson
that is fine for small integers but that method is not practical for 70 digit integers, there may be cases where that would work but in general it's not practical
09-30-2024, 12:03 PM (This post was last modified: 09-30-2024, 12:06 PM by SMcNeill.)
(09-30-2024, 10:59 AM)Jack Wrote: thanks eoredson
that is fine for small integers but that method is not practical for 70 digit integers, there may be cases where that would work but in general it's not practical
First thing I'd check with 70 digit numbers would be:
SELECT CASE RIGHT$(STR$(num),1)
CASE 2, 4, 6, 8, 0 '2 is a factor. simplify by that amount
CASE 5 '5 is a factor, simplify by that amount
CASE ELSE 'may be a prime as all primes above 10 end in 1, 3, 7, 9
'this case is the one where you're going to end having to your string math
'but if it's smaller than an INT64 by the time you get to this point (which is close to 18 digits, if I remember correctly)
'then you can just do this with normal numbers and not have to do string math
'either way, you've managed to simplify 60% of all numbers before you ever got to this complex processing point, and that's a nice WIN
END SELECT