Why does setting the condition to x*x < n not work in finding prime factors?

  • Thread starter Thread starter CrazyNeutrino
  • Start date Start date
  • Tags Tags
    Euler Project
Click For Summary
SUMMARY

The discussion centers on the implementation of a trial division algorithm in C to find the largest prime factor of the number 600851475143. The original code incorrectly attempts to limit the factor search using the condition x*x < n, which fails due to the dynamic reduction of n during the loop. The correct approach is to use x < n, as the value of n decreases with each factor found, ensuring that all potential factors are checked. The final correct answer for the largest prime factor is 6857.

PREREQUISITES
  • Understanding of trial division for prime factorization
  • Familiarity with C programming syntax and structures
  • Knowledge of integer arithmetic and data types in C
  • Concept of square roots and their application in optimization
NEXT STEPS
  • Learn about optimizing prime factorization algorithms in C
  • Explore the use of the Sieve of Eratosthenes for finding prime numbers
  • Study the mathematical properties of prime factors and their distributions
  • Investigate the implications of modifying loop conditions in iterative algorithms
USEFUL FOR

Programmers, computer science students, and anyone interested in algorithm optimization and number theory, particularly in the context of prime factorization.

CrazyNeutrino
Messages
99
Reaction score
0
I've just started with project Euler. The problem I just finished is phrased as follows:

"The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?"

The method i used was trial division. Here is my code in C:
C:
#include<stdio.h>
int main()
{
     long long n = 600851475143;
     long long x;
     long long factor;

     for(x=2; x<n; x++)
     {
          while( n % x == 0 )
          {
                n =  n / x; 
                factor = x;
           }
     }

     printf("\n%lld\n", x);
     return 0;
}

Although this did solve the problem, (answer is 6572) I have read that you only need to check for factors upto the square root of n. I tried doing this by setting the condition x*x<n instead of x<n. This however, does not work and prints a value of 1472. Can someone explain why?
 
Last edited by a moderator:
Technology news on Phys.org
Your code is wrong. Neither 6572 nor 1472 are factors of 600851475143. Notice that the variable factor is never used. I suggest getting it working on smaller numbers first. Also, think about what happens if you find a factor x, and this leads to a new value of n=n/x which is smaller than x.
 
Last edited:
My apologies, i meant 6857. My program generated the correct answer. Admittedly I'm not too sure why and i don't know why it doesn't work when i try x*x<n. Also, i meant to print factor, not x.
 
CrazyNeutrino said:
My apologies, i meant 6857. My program generated the correct answer. Admittedly I'm not too sure why and i don't know why it doesn't work when i try x*x<n. Also, i meant to print factor, not x.

Does your original code (with x<n) work when you print factor?

Let me ask another question. Do you realize that when you update the value of n inside the for loop, that this impacts the test (x<n or x*x<n) which is done to decide when to exit the loop?
 
Last edited:
CrazyNeutrino said:
Although this did solve the problem, (answer is 6572) I have read that you only need to check for factors up to the square root of n. I tried doing this by setting the condition x*x<n instead of x<n. This however, does not work and prints a value of 1472. Can someone explain why?
600851475143 = 71×839×1471×6857.

During the loop the values for n are:

600851475143/17 = 8462696833
8462696833/839 = 10086647
10086647/1471 = 6857
6857/6857 = 1

So the check for x < n is the correct check to use in this case. If n wasn't being divided each time a factor was found, then the check for x*x < n would work.
 
  • Like
Likes CrazyNeutrino
We have many threads on AI, which are mostly AI/LLM, e.g,. ChatGPT, Claude, etc. It is important to draw a distinction between AI/LLM and AI/ML/DL, where ML - Machine Learning and DL = Deep Learning. AI is a broad technology; the AI/ML/DL is being developed to handle large data sets, and even seemingly disparate datasets to rapidly evaluated the data and determine the quantitative relationships in order to understand what those relationships (about the variaboles) mean. At the Harvard &...

Similar threads

  • · Replies 14 ·
Replies
14
Views
5K
  • · Replies 39 ·
2
Replies
39
Views
4K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 80 ·
3
Replies
80
Views
10K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 5 ·
Replies
5
Views
3K
Replies
2
Views
5K
  • · Replies 17 ·
Replies
17
Views
7K
Replies
6
Views
4K
  • · Replies 175 ·
6
Replies
175
Views
26K