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?

조회 수: 8 (최근 30일)
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
David Goodmanson
David Goodmanson 2021년 4월 24일
Hi Travis,
for n=14 for example, will 2x7 (which fits the rule) be all right, or would 3x5 be better? for n = 22 would 2x11 be all right, or would 4x6 be better?
Travis Briles
Travis Briles 2021년 4월 24일
Good point. Yes I agree that for N=14-> 3x5 is better. Same for N=22 -> 4x6.

댓글을 달려면 로그인하십시오.

채택된 답변

Clayton Gotberg
Clayton Gotberg 2021년 4월 24일
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;
  댓글 수: 3
Steven Lord
Steven Lord 2021년 4월 24일
The only case for positive N where both N and N+1 are prime is when N = 2.
Clayton Gotberg
Clayton Gotberg 2021년 4월 24일
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

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by