14 views (last 30 days)

Show older comments

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. ).

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

% https://www.mathworks.com/matlabcentral/answers/21542-find-divisors-for-a-given-number#comment_806547

factors = possible_factors(rem(N,possible_factors)==0);

[~, indexOfMin] = min(abs(factors-sqrt(N))); % Thanks @ImageAnalyst

% https://www.mathworks.com/matlabcentral/answers/152301-find-closest-value-in-array#comment_536274

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

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!