# How to find the pair of divisors which are closest in value for a non-prime number? If prime, how to do this for the next largest non-prime?

14 views (last 30 days)
Travis Briles on 24 Apr 2021
Commented: Travis Briles on 24 Apr 2021
Case 1: I would like to find the largest two divsors, 'a' and 'b', of a non-prime integer, N such that N = a*b. For instance if N=24, I would like to a code that finds [a,b]=[4,6] not [a,b] = [2,12] etc.
Case 2: If N is prime, say N=11, how do I do this for the next non-prime number? so N=11->N=12 and [a,b] = [3,4].
(For context, I have a loop that generates a number of traces to be plotted where the value N is not known ahead of time. Sometimes N=3 and sometimes N=23. I'm trying to arrange the plots with subplot in a mostly 'square' arrangement that isn't just a skinny column or a skinny row. ).
##### 2 CommentsShowHide 1 older comment
Travis Briles on 24 Apr 2021
Good point. Yes I agree that for N=14-> 3x5 is better. Same for N=22 -> 4x6.

Clayton Gotberg on 24 Apr 2021
If you're not dead-set on your method for determining the number of tiles in a subplot, how about using the square root of the integer N to decide the size of the subplot?
EX:
N = 24;
rows = floor(sqrt(N)); % sqrt(N) is ~4.89, k =4
columns = ceil(N/rows); % Makes certain there are enough columns to fit all of the tiles
With this method there may be extra tiles (for example, with N = 10 there would be 3x4 tiles with two unused) but the output should be about as square as possible.
If you want to find all divisors of a number and pick the ones that are squarest, you can try:
N = 24;
if isprime(N)
N = N+1;
end
possible_factors = 1:ceil(sqrt(N)); % Thanks @Peter
factors = possible_factors(rem(N,possible_factors)==0);
[~, indexOfMin] = min(abs(factors-sqrt(N))); % Thanks @ImageAnalyst
square_row_value = factors(indexOfMin);
square_column_value = N/square_row_value;
Clayton Gotberg on 24 Apr 2021
There I go again! Maybe you do want to loop the check until N is definitely no longer prime.
while isprime(N)
N=N+1;
end