Magnanimous numbers: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|Pascal}}: restore visibility of Perl entry)
(→‎{{header|Pascal}}: using gmp for numbers >MAXLIMIT improves speed enormous)
Line 1,078: Line 1,078:
{{works with|Free Pascal}}
{{works with|Free Pascal}}
Version nearly like on Talk. Generating the sieve for primes takes most of the time.<br>
Version nearly like on Talk. Generating the sieve for primes takes most of the time.<br>
found all til #564 : 9,151,995,592 in 0.795 s
On TIO.RUN found all til 569 84448000009 in 19.171 s
<lang pascal>program Magnanimous;
<lang pascal>program Magnanimous;
//Magnanimous Numbers
//Magnanimous Numbers
//algorithm find only numbers where all digits are even except the last
//algorithm find only numbers where all digits are even except the last
//or where all digits are odd except the last
//or where all digits are odd except the last
//Magnanimous Numbers that can not be found by this algorithm
//so 1,11,20,101,1001 will not be found
//starting at 100001 "1>"+x"0"+"1" is not prime because of 1001 not prime
//0,1,11,20,101,1001
{$IFDEF FPC}
{$IFDEF FPC}
{$MODE DELPHI}
{$MODE DELPHI}
{$Optimization ON,ALL}
{$Optimization ON}
{$CODEALIGN proc=16}
{$CODEALIGN proc=16}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
{$ENDIF}
{$DEFINE USE_GMP}
uses
uses
strUtils,SysUtils;
//strUtils, // commatize Numb2USA
{$IFDEF USE_GMP} gmp,{$ENDIF}
SysUtils;
const
const
MaxLimit = 1000*1000*1000;
MaxLimit = 100*1000*1000 +10;// 1e8 == MAXHIGHIDX = 7
MAXHIGHIDX = 11;
type
type
tprimes = array of byte;
tprimes = array of byte;
tBaseType = word;
tBaseType = word;
tpBaseType = pWord;
tpBaseType = pWord;
tBase =array[0..15] of tBaseType;
tBase =array[0..31] of tBaseType;


tNumType = NativeUint;
tNumType = NativeUint;
tSplitNum =array[0..15] of tNumType;
tSplitNum =array[0..15] of tNumType;
tMagList = array[0..571] of Uint64;
tMagList = array[0..1000] of Uint64;
var
var
{$ALIGN 32}
{$ALIGN 32}
Line 1,110: Line 1,116:
MagList : tMagList;
MagList : tMagList;
primes : tprimes;
primes : tprimes;
{$IFDEF USE_GMP} z : mpz_t;gmp_count :NativeUint;{$ENDIF}
pPrimes0 : pByte;
pPrimes0 : pByte;
T0: int64;
T0: int64;
Line 1,126: Line 1,133:
begin
begin
pMag[j+1]:=pMag[j];
pMag[j+1]:=pMag[j];
Dec(j);
Dec(j);
end;
pMag[j+1]:= pivot;
end;
end;
pMag[j+1]:= pivot;
end;
end;

function isprime(n: NativeUint):boolean;
var
k,flipflop: NativeUint;
Begin
if Not(odd(n)) then
EXIT(false);
if n mod 3 = 0 then
EXIT(false);
k := 5;
flipflop := 2;
while k*k<=n do
Begin
if n mod k = 0 then
EXIT(false);
inc(k,flipflop);
flipflop := 6-flipflop;
end;
end;
EXIT(true);
end;


procedure InitPrimes;
procedure InitPrimes;
Line 1,171: Line 1,198:


p := smallprimes[High(smallprimes)];
p := smallprimes[High(smallprimes)];
//sieve with next primes
repeat
repeat
repeat
repeat
inc(p,2)
inc(p)
until pPrimes[p] = 0;
until pPrimes[p] = 0;
//j = maxfactor of p in l
j := l div p;
j := l div p;
// make j prime
while (pPrimes[j]<> 0) AND (j>=p) do
while (pPrimes[j]<> 0) AND (j>=p) do
dec(j);
dec(j);
if j<p then
if j<p then
BREAK;
BREAK;
//delta going downwards no factor 2,3 :-2 -4 -2 -4 //prime must >= 5
//delta going downwards no factor 2,3 :-2 -4 -2 -4
//to minimize memory accesses in deep space...
i := (j+1) mod 6;
i := (j+1) mod 6;
if i = 0 then
if i = 0 then
i :=4;
i :=4;
repeat
repeat
//search next prime factor
while (pPrimes[j]<> 0) AND (j>=p) do
while (pPrimes[j]<> 0) AND (j>=p) do
begin
begin
Line 1,197: Line 1,219:
if j<p then
if j<p then
BREAK;
BREAK;
//access far memory , unmark prime .
pPrimes[j*p] := 1;
pPrimes[j*p] := 1;
dec(j,i);
dec(j,i);
Line 1,213: Line 1,234:
begin
begin
pb:= @dgtBase5[0];
pb:= @dgtBase5[0];
write(num:15);
for i := HighIdx downto 0 do
for i := HighIdx downto 0 do
write(pB[i]:2);
write(pB[i]:2);
writeln;
write(#13);
end;
end;


Line 1,273: Line 1,295:
end;
end;


function isMagn(var dgtBase10: tBase):boolean;
procedure CheckMagn(var dgtBase10: tBase);
//split number into sum of all "partitions" of digits
//split number into sum of all "partitions" of digits
//check if sum is always prime
//check if sum is always prime
//1234 -> 1+234,12+34 ; 123+4
//1234 -> 1+234,12+34 ;123+4
var
var
LowSplitNum
LowSplitNum :tSplitNum;
// ,HighSplitNum //not needed for small numbers
:tSplitNum;
i,fac,n: NativeInt;
i,fac,n: NativeInt;
isMagn : boolean;
Begin
Begin

n := 0;
n := 0;
fac := 1;
fac := 1;
Line 1,295: Line 1,315:
n := 0;
n := 0;
fac := HighIdx;
fac := HighIdx;
result := true;
isMagn := true;

For i := 0 to fac-1 do
For i := 0 to fac-1 do
begin
begin
//n = HighSplitNum[i]
n := n*10+dgtBase10[fac-i];
n := n*10+dgtBase10[fac-i];
//HighSplitNum[i]:= n;
LowSplitNum[i] += n;
//test if not isMagn as soon as possible
result := result AND ( pPrimes0[LowSplitNum[i] +n] = 0);
IF not(result) then
if LowSplitNum[i]<=MAXLIMIT then
break;
begin
isMagn := isMagn AND (pPrimes0[LowSplitNum[i]] = 0);
if NOT(isMagn) then
EXIT;
end;
end;
end;
{$IFDEF USE_GMP}
For i := 0 to fac-1 do
begin
n := LowSplitNum[i];
if n >MAXLIMIT then
Begin
mpz_set_ui(z,n);
gmp_count +=1;
isMagn := isMagn AND (mpz_probab_prime_p(z,1) >0);
if NOT(isMagn) then
EXIT;
end;
end;
{$ENDIF}
//insert magnanimous numbers
num := Base10toNum(dgtBase10);
MagList[MagIdx] := num;
inc(MagIdx);
//OutBase5;
end;
end;


BEGIN
begin
{$IFDEF USE_GMP}mpz_init_set_ui(z,0);{$ENDIF}
T0 := Gettickcount64;
T0 := Gettickcount64;
InitPrimes;
InitPrimes;
Line 1,322: Line 1,368:
MagList[MagIdx] := 101;inc(MagIdx);
MagList[MagIdx] := 101;inc(MagIdx);
MagList[MagIdx] := 1001;inc(MagIdx);
MagList[MagIdx] := 1001;inc(MagIdx);

{$IFDEF USE_GMP} mpz_init_set_ui(z,0);{$ENDIF}


HighIdx := 0;
HighIdx := 0;
Line 1,329: Line 1,377:
begin
begin
CnvEvenBase10(lstIdx);
CnvEvenBase10(lstIdx);
num := Base10toNum(dgtEvenBase10);
CheckMagn(dgtEvenBase10);
if isMagn(dgtEvenBase10)then
Begin
MagList[MagIdx] := num;
inc(MagIdx);
// write(num:10,' ');OutBase5;
end;
end;
end;
CnvOddBase10(lstIdx);
CnvOddBase10(lstIdx);
num := Base10toNum(dgtOddBase10);
CheckMagn(dgtOddBase10);
if isMagn(dgtOddBase10) then
Begin
MagList[MagIdx] := num;
inc(MagIdx);
// write(num:10,' ');OutBase5;
end;
lstIdx := IncDgtBase5;
lstIdx := IncDgtBase5;
until HighIdx > trunc(ln(MaxLimit)/ln(10));
until HighIdx > MAXHIGHIDX;
writeln;
InsertSort(@MagList[0],0,MagIdx-1);
InsertSort(@MagList[0],0,MagIdx-1);
{$IFDEF USE_GMP} mpz_clear(z);writeln('Count of gmp tests ',gmp_count);{$ENDIF}
For cnt := 0 to MagIdx-1 do
For cnt := 0 to MagIdx-1 do
writeln(cnt+1:3,' ',Numb2USA(IntToStr(MagList[cnt])));
writeln(cnt+1:3,' ',MagList[cnt]);

T0 -= Gettickcount64;
T0 -= Gettickcount64;
writeln(-T0 / 1000: 0: 3, ' s');
writeln(-T0 / 1000: 0: 3, ' s');
{$IFDEF Windows}
{$IFDEF WINDOWS}
readln;
readln;
{$ENDIF}
{$ENDIF}
end.
end.
Line 1,360: Line 1,399:
<pre style="height:180px">
<pre style="height:180px">
TIO.RUN
TIO.RUN
getting primes 0.311 s
// copied last lines 564 9,151,995,592--0.795 s

//Real time: 6.936 s User time: 4.921 s Sys. time: 1.843 s CPU share: 97.51 %
Count of gmp tests 102061
getting primes 5.530 s
1 0
1 0
2 1
2 1
Line 1,485: Line 1,524:
121 994
121 994
122 998
122 998
123 1,001
123 1001
124 1,112
124 1112
125 1,130
125 1130
126 1,198
126 1198
127 1,310
127 1310
128 1,316
128 1316
129 1,598
129 1598
130 1,756
130 1756
131 1,772
131 1772
132 1,910
132 1910
133 1,918
133 1918
134 1,952
134 1952
135 1,970
135 1970
136 1,990
136 1990
137 2,209
137 2209
138 2,221
138 2221
139 2,225
139 2225
140 2,249
140 2249
141 2,261
141 2261
142 2,267
142 2267
143 2,281
143 2281
144 2,429
144 2429
145 2,447
145 2447
146 2,465
146 2465
147 2,489
147 2489
148 2,645
148 2645
149 2,681
149 2681
150 2,885
150 2885
151 3,110
151 3110
152 3,170
152 3170
153 3,310
153 3310
154 3,334
154 3334
155 3,370
155 3370
156 3,398
156 3398
157 3,518
157 3518
158 3,554
158 3554
159 3,730
159 3730
160 3,736
160 3736
161 3,794
161 3794
162 3,934
162 3934
163 3,974
163 3974
164 4,001
164 4001
165 4,027
165 4027
166 4,063
166 4063
167 4,229
167 4229
168 4,247
168 4247
169 4,265
169 4265
170 4,267
170 4267
171 4,427
171 4427
172 4,445
172 4445
173 4,463
173 4463
174 4,643
174 4643
175 4,825
175 4825
176 4,883
176 4883
177 5,158
177 5158
178 5,176
178 5176
179 5,374
179 5374
180 5,516
180 5516
181 5,552
181 5552
182 5,558
182 5558
183 5,594
183 5594
184 5,752
184 5752
185 5,972
185 5972
186 5,992
186 5992
187 6,001
187 6001
188 6,007
188 6007
189 6,067
189 6067
190 6,265
190 6265
191 6,403
191 6403
192 6,425
192 6425
193 6,443
193 6443
194 6,485
194 6485
195 6,601
195 6601
196 6,685
196 6685
197 6,803
197 6803
198 6,821
198 6821
199 7,330
199 7330
200 7,376
200 7376
201 7,390
201 7390
202 7,394
202 7394
203 7,534
203 7534
204 7,556
204 7556
205 7,592
205 7592
206 7,712
206 7712
207 7,934
207 7934
208 7,970
208 7970
209 8,009
209 8009
210 8,029
210 8029
211 8,221
211 8221
212 8,225
212 8225
213 8,801
213 8801
214 8,821
214 8821
215 9,118
215 9118
216 9,172
216 9172
217 9,190
217 9190
218 9,338
218 9338
219 9,370
219 9370
220 9,374
220 9374
221 9,512
221 9512
222 9,598
222 9598
223 9,710
223 9710
224 9,734
224 9734
225 9,752
225 9752
226 9,910
226 9910
227 11,116
227 11116
228 11,152
228 11152
229 11,170
229 11170
230 11,558
230 11558
231 11,930
231 11930
232 13,118
232 13118
233 13,136
233 13136
234 13,556
234 13556
235 15,572
235 15572
236 15,736
236 15736
237 15,938
237 15938
238 15,952
238 15952
239 17,716
239 17716
240 17,752
240 17752
241 17,992
241 17992
242 19,972
242 19972
243 20,209
243 20209
244 20,261
244 20261
245 20,861
245 20861
246 22,061
246 22061
247 22,201
247 22201
248 22,801
248 22801
249 22,885
249 22885
250 24,407
250 24407
251 26,201
251 26201
252 26,285
252 26285
253 26,881
253 26881
254 28,285
254 28285
255 28,429
255 28429
256 31,370
256 31370
257 31,756
257 31756
258 33,118
258 33118
259 33,538
259 33538
260 33,554
260 33554
261 35,116
261 35116
262 35,776
262 35776
263 37,190
263 37190
264 37,556
264 37556
265 37,790
265 37790
266 37,930
266 37930
267 39,158
267 39158
268 39,394
268 39394
269 40,001
269 40001
270 40,043
270 40043
271 40,049
271 40049
272 40,067
272 40067
273 40,427
273 40427
274 40,463
274 40463
275 40,483
275 40483
276 42,209
276 42209
277 42,265
277 42265
278 44,009
278 44009
279 44,443
279 44443
280 44,447
280 44447
281 46,445
281 46445
282 48,089
282 48089
283 48,265
283 48265
284 51,112
284 51112
285 53,176
285 53176
286 53,756
286 53756
287 53,918
287 53918
288 55,516
288 55516
289 55,552
289 55552
290 55,558
290 55558
291 55,576
291 55576
292 55,774
292 55774
293 57,116
293 57116
294 57,754
294 57754
295 60,007
295 60007
296 60,047
296 60047
297 60,403
297 60403
298 60,443
298 60443
299 60,667
299 60667
300 62,021
300 62021
301 62,665
301 62665
302 64,645
302 64645
303 66,667
303 66667
304 66,685
304 66685
305 68,003
305 68003
306 68,683
306 68683
307 71,536
307 71536
308 71,572
308 71572
309 71,716
309 71716
310 71,752
310 71752
311 73,156
311 73156
312 75,374
312 75374
313 75,556
313 75556
314 77,152
314 77152
315 77,554
315 77554
316 79,330
316 79330
317 79,370
317 79370
318 80,009
318 80009
319 80,029
319 80029
320 80,801
320 80801
321 80,849
321 80849
322 82,265
322 82265
323 82,285
323 82285
324 82,825
324 82825
325 82,829
325 82829
326 84,265
326 84265
327 86,081
327 86081
328 86,221
328 86221
329 88,061
329 88061
330 88,229
330 88229
331 88,265
331 88265
332 88,621
332 88621
333 91,792
333 91792
334 93,338
334 93338
335 93,958
335 93958
336 93,994
336 93994
337 99,712
337 99712
338 99,998
338 99998
339 111,112
339 111112
340 111,118
340 111118
341 111,170
341 111170
342 111,310
342 111310
343 113,170
343 113170
344 115,136
344 115136
345 115,198
345 115198
346 115,772
346 115772
347 117,116
347 117116
348 119,792
348 119792
349 135,158
349 135158
350 139,138
350 139138
351 151,156
351 151156
352 151,592
352 151592
353 159,118
353 159118
354 177,556
354 177556
355 193,910
355 193910
356 199,190
356 199190
357 200,209
357 200209
358 200,809
358 200809
359 220,021
359 220021
360 220,661
360 220661
361 222,245
361 222245
362 224,027
362 224027
363 226,447
363 226447
364 226,681
364 226681
365 228,601
365 228601
366 282,809
366 282809
367 282,881
367 282881
368 282,889
368 282889
369 311,156
369 311156
370 319,910
370 319910
371 331,118
371 331118
372 333,770
372 333770
373 333,994
373 333994
374 335,156
374 335156
375 339,370
375 339370
376 351,938
376 351938
377 359,794
377 359794
378 371,116
378 371116
379 373,130
379 373130
380 393,554
380 393554
381 399,710
381 399710
382 400,049
382 400049
383 404,249
383 404249
384 408,049
384 408049
385 408,889
385 408889
386 424,607
386 424607
387 440,843
387 440843
388 464,447
388 464447
389 484,063
389 484063
390 484,445
390 484445
391 486,685
391 486685
392 488,489
392 488489
393 515,116
393 515116
394 533,176
394 533176
395 551,558
395 551558
396 559,952
396 559952
397 595,592
397 595592
398 595,598
398 595598
399 600,881
399 600881
400 602,081
400 602081
401 626,261
401 626261
402 628,601
402 628601
403 644,485
403 644485
404 684,425
404 684425
405 686,285
405 686285
406 711,512
406 711512
407 719,710
407 719710
408 753,316
408 753316
409 755,156
409 755156
410 773,554
410 773554
411 777,712
411 777712
412 777,776
412 777776
413 799,394
413 799394
414 799,712
414 799712
415 800,483
415 800483
416 802,061
416 802061
417 802,081
417 802081
418 804,863
418 804863
419 806,021
419 806021
420 806,483
420 806483
421 806,681
421 806681
422 822,265
422 822265
423 864,883
423 864883
424 888,485
424 888485
425 888,601
425 888601
426 888,643
426 888643
427 911,390
427 911390
428 911,518
428 911518
429 915,752
429 915752
430 931,130
430 931130
431 975,772
431 975772
432 979,592
432 979592
433 991,118
433 991118
434 999,994
434 999994
435 1,115,756
435 1115756
436 1,137,770
436 1137770
437 1,191,518
437 1191518
438 1,197,370
438 1197370
439 1,353,136
439 1353136
440 1,379,930
440 1379930
441 1,533,736
441 1533736
442 1,593,538
442 1593538
443 1,711,576
443 1711576
444 1,791,110
444 1791110
445 1,795,912
445 1795912
446 1,915,972
446 1915972
447 1,951,958
447 1951958
448 2,000,221
448 2000221
449 2,008,829
449 2008829
450 2,442,485
450 2442485
451 2,604,067
451 2604067
452 2,606,647
452 2606647
453 2,664,425
453 2664425
454 2,666,021
454 2666021
455 2,828,809
455 2828809
456 2,862,445
456 2862445
457 3,155,116
457 3155116
458 3,171,710
458 3171710
459 3,193,198
459 3193198
460 3,195,338
460 3195338
461 3,195,398
461 3195398
462 3,315,358
462 3315358
463 3,373,336
463 3373336
464 3,573,716
464 3573716
465 3,737,534
465 3737534
466 3,751,576
466 3751576
467 3,939,118
467 3939118
468 4,000,483
468 4000483
469 4,408,603
469 4408603
470 4,468,865
470 4468865
471 4,488,245
471 4488245
472 4,644,407
472 4644407
473 5,115,736
473 5115736
474 5,357,776
474 5357776
475 5,551,376
475 5551376
476 5,579,774
476 5579774
477 5,731,136
477 5731136
478 5,759,594
478 5759594
479 5,959,774
479 5959774
480 6,462,667
480 6462667
481 6,600,227
481 6600227
482 6,600,443
482 6600443
483 6,608,081
483 6608081
484 6,640,063
484 6640063
485 6,640,643
485 6640643
486 6,824,665
486 6824665
487 6,864,485
487 6864485
488 6,866,683
488 6866683
489 7,113,710
489 7113710
490 7,133,110
490 7133110
491 7,139,390
491 7139390
492 7,153,336
492 7153336
493 7,159,172
493 7159172
494 7,311,170
494 7311170
495 7,351,376
495 7351376
496 7,719,370
496 7719370
497 7,959,934
497 7959934
498 7,979,534
498 7979534
499 8,044,009
499 8044009
500 8,068,201
500 8068201
501 8,608,081
501 8608081
502 8,844,449
502 8844449
503 9,171,170
503 9171170
504 9,777,910
504 9777910
505 9,959,374
505 9959374
506 11,771,992
506 11771992
507 13,913,170
507 13913170
508 15,177,112
508 15177112
509 17,115,116
509 17115116
510 19,337,170
510 19337170
511 19,713,130
511 19713130
512 20,266,681
512 20266681
513 22,086,821
513 22086821
514 22,600,601
514 22600601
515 22,862,885
515 22862885
516 26,428,645
516 26428645
517 28,862,465
517 28862465
518 33,939,518
518 33939518
519 37,959,994
519 37959994
520 40,866,083
520 40866083
521 44,866,043
521 44866043
522 48,606,043
522 48606043
523 48,804,809
523 48804809
524 51,137,776
524 51137776
525 51,513,118
525 51513118
526 53,151,376
526 53151376
527 53,775,934
527 53775934
528 59,593,574
528 59593574
529 60,402,247
529 60402247
530 60,860,603
530 60860603
531 62,202,281
531 62202281
532 64,622,665
532 64622665
533 66,864,625
533 66864625
534 66,886,483
534 66886483
535 71,553,536
535 71553536
536 77,917,592
536 77917592
537 82,486,825
537 82486825
538 86,842,265
538 86842265
539 91,959,398
539 91959398
540 95,559,998
540 95559998
541 117,711,170
541 117711170
542 222,866,845
542 222866845
543 228,440,489
543 228440489
544 244,064,027
544 244064027
545 280,422,829
545 280422829
546 331,111,958
546 331111958
547 400,044,049
547 400044049
548 460,040,803
548 460040803
549 511,151,552
549 511151552
550 593,559,374
550 593559374
551 606,202,627
551 606202627
552 608,844,043
552 608844043
553 622,622,801
553 622622801
554 622,888,465
554 622888465
555 773,719,910
555 773719910
556 844,460,063
556 844460063
557 882,428,665
557 882428665
558 995,955,112
558 995955112
559 1,777,137,770
559 1777137770
560 2,240,064,227
560 2240064227
561 2,444,402,809
561 2444402809
562 5,753,779,594
562 5753779594
563 6,464,886,245
563 6464886245
564 9,151,995,592
564 9151995592
565 22226226625
0.795 s</pre>
566 31993717930
567 39393115598
568 46884486265
569 84448000009
19.171 s

Real time: 19.793 s User time: 19.520 s Sys. time: 0.095 s CPU share: 99.09 %</pre>


=={{header|Perl}}==
=={{header|Perl}}==

Revision as of 10:58, 4 October 2021

Task
Magnanimous numbers
You are encouraged to solve this task according to the task description, using any language you may know.

A magnanimous number is an integer where there is no place in the number where a + (plus sign) could be added between any two digits to give a non-prime sum.


E.G.
  • 6425 is a magnanimous number. 6 + 425 == 431 which is prime; 64 + 25 == 89 which is prime; 642 + 5 == 647 which is prime.
  • 3538 is not a magnanimous number. 3 + 538 == 541 which is prime; 35 + 38 == 73 which is prime; but 353 + 8 == 361 which is not prime.


Traditionally the single digit numbers 0 through 9 are included as magnanimous numbers as there is no place in the number where you can add a plus between two digits at all. (Kind of weaselly but there you are...) Except for the actual value 0, leading zeros are not permitted. Internal zeros are fine though, 1001 -> 1 + 001 (prime), 10 + 01 (prime) 100 + 1 (prime).

There are only 571 known magnanimous numbers. It is strongly suspected, though not rigorously proved, that there are no magnanimous numbers above 97393713331910, the largest one known.


Task
  • Write a routine (procedure, function, whatever) to find magnanimous numbers.
  • Use that function to find and display, here on this page the first 45 magnanimous numbers.
  • Use that function to find and display, here on this page the 241st through 250th magnanimous numbers.
  • Stretch: Use that function to find and display, here on this page the 391st through 400th magnanimous numbers


See also


ALGOL 68

<lang algol68>BEGIN # find some magnanimous numbers - numbers where inserting a + between any #

     # digits ab=nd evaluatinf the sum results in a prime in all cases         #
   # returns the first n magnanimous numbers                                   #
   #         uses global sieve prime which must include 0 and be large enough  #
   #         for all possible sub-sequences of digits                          #
   OP MAGNANIMOUS = ( INT n )[]INT:
      BEGIN
           [ 1 : n ]INT result;
           INT          m count := 0;
           FOR i FROM 0 WHILE m count < n DO
               # split the number into pairs of digit seuences and check the sums of the pairs are all prime #
               INT  divisor   := 1;
               BOOL all prime := TRUE;
               WHILE divisor *:= 10;
                     IF   INT front = i OVER divisor;
                          front = 0
                     THEN FALSE
                     ELSE all prime := prime[ front + ( i MOD divisor ) ]
                     FI
               DO SKIP OD;
               IF all prime THEN result[ m count +:= 1 ] := i FI
           OD;
           result
      END; # MAGNANIMPUS #
   # prints part of a seuence of magnanimous numbers #
   PROC print magnanimous = ( []INT m, INT first, INT last, STRING legend )VOID:
        BEGIN
            print( ( legend, ":", newline ) );
            FOR i FROM first TO last DO print( ( " ", whole( m[ i ], 0 ) ) ) OD;
            print( ( newline ) )
        END ; # print magnanimous #
   # we assume the first 400 magnanimous numbers will be in 0 .. 1 000 000 #
   # so we will need a sieve of 0 up to 99 999 + 9 #
   [ 0 : 99 999 + 9 ]BOOL prime;
   prime[ 0 ] := prime[ 1 ] := FALSE; prime[ 2 ] := TRUE;
   FOR i FROM 3 BY 2 TO UPB prime DO prime[ i ] := TRUE  OD;
   FOR i FROM 4 BY 2 TO UPB prime DO prime[ i ] := FALSE OD;
   FOR i FROM 3 BY 2 TO ENTIER sqrt( UPB prime ) DO
       IF prime[ i ] THEN FOR s FROM i * i BY i + i TO UPB prime DO prime[ s ] := FALSE OD FI
   OD;
   # construct the sequence of magnanimous numbers #
   []INT m = MAGNANIMOUS 400;
   print magnanimous( m,   1,  45, "First 45 magnanimous numbers" );
   print magnanimous( m, 241, 250, "Magnanimous numbers 241-250"  );
   print magnanimous( m, 391, 400, "Magnanimous numbers 391-400"  )

END</lang>

Output:
First 45 magnanimous numbers:
 0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 58 61 65 67 70 74 76 83 85 89 92 94 98 101 110
Magnanimous numbers 241-250:
 17992 19972 20209 20261 20861 22061 22201 22801 22885 24407
Magnanimous numbers 391-400:
 486685 488489 515116 533176 551558 559952 595592 595598 600881 602081

ALGOL W

<lang algolw>begin

   % find some Magnanimous numbers - numbers where inserting a "+" between  %
   % any two of the digits and evaluating the sum results in a prime number %
   % implements the sieve of Eratosthenes                                   %
   procedure sieve( logical array s ( * ); integer value n ) ;
   begin
       % start with everything flagged as prime                             % 
       for i := 1 until n do s( i ) := true;
       % sieve out the non-primes                                           %
       s( 1 ) := false;
       for i := 2 until truncate( sqrt( n ) ) do begin
           if s( i ) then for p := i * i step i until n do s( p ) := false
       end for_i ;
   end sieve ;
   % construct an array of magnanimous numbers using the isPrime sieve      %
   procedure findMagnanimous ( logical array magnanimous, isPrime ( * ) ) ;
   begin
       % 1 digit magnanimous numbers                                        %
       for i :=  0 until 9               do magnanimous( i ) := true;
       % initially, the other magnanimous numbers are unknown               %
       for i := 10 until MAGNANIMOUS_MAX do magnanimous( i ) := false;
       % 2 & 3 digit magnanimous numbers                                    %
       for d1 := 1 until 9 do begin
           for d2 := 0 until 9 do begin
               if isPrime( d1 + d2 ) then magnanimous( ( d1 * 10 ) + d2 ) := true
           end for_d2 ;
           for d23 := 0 until 99 do begin
               if isPrime( d1 + d23 ) then begin
                   integer d12, d3;
                   d3  := d23 rem 10;
                   d12 := ( d1 * 10 ) + ( d23 div 10 );
                   if isPrime( d12 + d3 ) then magnanimous( ( d12 * 10 ) + d3 ) := true
               end if_isPrime_d1_plus_d23
           end for_d23
       end for_d1 ;
       % 4 & 5 digit magnanimous numbers                                    %
       for d12 := 10 until 99 do begin
           for d34 := 0 until 99 do begin
               if isPrime( d12 + d34 ) then begin
                   integer d123, d4;
                   d123 := ( d12 * 10 ) + ( d34 div 10 );
                   d4   := d34 rem 10;
                   if isPrime( d123 + d4 ) then begin
                       integer d1, d234;
                       d1   := d12 div 10;
                       d234 := ( ( d12 rem 10 ) * 100 ) + d34;
                       if  isPrime( d1 + d234 ) then magnanimous( ( d12 * 100 ) + d34 ) := true
                   end if_isPrime_d123_plus_d4
               end if_isPrime_d12_plus_d34
           end for_d34 ;
           for d345 := 0 until 999 do begin
               if isPrime( d12 + d345 ) then begin
                   integer d123, d45;
                   d123 := ( d12 * 10 ) + ( d345 div 100 );
                   d45  := d345 rem 100;
                   if isPrime( d123 + d45 ) then begin
                       integer d1234, d5;
                       d1234 := ( d123 * 10 ) + ( d45 div 10 );
                       d5    := d45 rem 10;
                       if isPrime( d1234 + d5 ) then begin
                           integer d1, d2345;
                           d1    := d12 div 10;
                           d2345 := ( ( d12 rem 10 ) * 1000 ) + d345;
                           if isPrime( d1 + d2345 ) then magnanimous( ( d12 * 1000 ) + d345 ) := true
                       end if_isPrime_d1234_plus_d5
                   end if_isPrime_d123_plus_d45
               end if_isPrime_d12_plus_d345
           end for_d234
       end for_d12 ;
       % find 6 digit magnanimous numbers                                   %
       for d123 := 100 until 999 do begin
           for d456 := 0 until 999 do begin
               if isPrime( d123 + d456 ) then begin
                   integer d1234, d56;
                   d1234 := ( d123 * 10 ) + ( d456 div 100 );
                   d56   := d456 rem 100;
                   if isPrime( d1234 + d56 ) then begin
                       integer d12345, d6;
                       d12345 := ( d1234 * 10 ) + ( d56 div 10 );
                       d6     := d56 rem 10;
                       if isPrime( d12345 + d6 ) then begin
                           integer d12, d3456;
                           d12   := d123 div 10;
                           d3456 := ( ( d123 rem 10 ) * 1000 ) + d456;
                           if isPrime( d12 + d3456 ) then begin
                               integer d1, d23456;
                               d1     := d12 div 10;
                               d23456 := ( ( d12 rem 10 ) * 10000 ) + d3456;
                               if isPrime( d1 + d23456 ) then magnanimous( ( d123 * 1000 ) + d456 ) := true
                           end if_isPrime_d12_plus_d3456
                       end if_isPrime_d12345_plus_d6
                   end if_isPrime_d1234_plus_d56
               end if_isPrime_d123_plus_d456
           end for_d456
       end for_d123
   end findMagnanimous ;
   % we look for magnanimous numbers with up to 6 digits, so we need to     %
   % check for primes up to 99999 + 9 = 100008                              %
   integer PRIME_MAX, MAGNANIMOUS_MAX;
   PRIME_MAX       :=  100008;
   MAGNANIMOUS_MAX := 1000000;
   begin
       logical array magnanimous ( 0 :: MAGNANIMOUS_MAX );
       logical array isPrime     ( 1 :: PRIME_MAX       );
       integer mPos;
       integer lastM;
       sieve( isPrime, PRIME_MAX );
       findMagnanimous( magnanimous, isPrime );
       % show some of the magnanimous numbers                               %
       lastM := mPos  := 0;
       i_w := 3; s_w := 1; % output formatting                              %
       for i := 0 until MAGNANIMOUS_MAX do begin
           if magnanimous( i ) then begin
               mPos  := mPos + 1;
               lastM := i;
               if      mPos =   1 then begin
                   write( "Magnanimous numbers 1-45:" );
                   write( i )
                   end
               else if mPos < 46 then begin
                   if mPos rem 15 = 1 then write( i )
                                      else writeon( i )
                   end
               else if mPos = 241 then begin
                   write( "Magnanimous numbers 241-250:" );
                   write( i )
                   end
               else if mPos > 241 and mPos <= 250 then writeon( i )
               else if mPos = 391 then begin
                   write( "Magnanimous numbers 391-400:" );
                   write( i )
                   end
               else if mPos > 391 and mPos <= 400 then writeon( i )
           end if_magnanimous_i
       end for_i ;
       i_w := 1; s_w := 0;
       write( "Last magnanimous number found: ", mPos, " = ", lastM )
   end

end.</lang>

Output:
Magnanimous numbers 1-45:
  0   1   2   3   4   5   6   7   8   9  11  12  14  16  20
 21  23  25  29  30  32  34  38  41  43  47  49  50  52  56
 58  61  65  67  70  74  76  83  85  89  92  94  98 101 110
Magnanimous numbers 241-250:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407
Magnanimous numbers 391-400:
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081
Last magnanimous number found: 434 = 999994

AWK

<lang AWK>

  1. syntax: GAWK -f MAGNANIMOUS_NUMBERS.AWK
  2. converted from C

BEGIN {

   magnanimous(1,45)
   magnanimous(241,250)
   magnanimous(391,400)
   exit(0)

} function is_magnanimous(n, p,q,r) {

   if (n < 10) { return(1) }
   for (p=10; ; p*=10) {
     q = int(n/p)
     r = n % p
     if (!is_prime(q+r)) { return(0) }
     if (q < 10) { break }
   }
   return(1)

} function is_prime(n, d) {

   d = 5
   if (n < 2) { return(0) }
   if (!(n % 2)) { return(n == 2) }
   if (!(n % 3)) { return(n == 3) }
   while (d*d <= n) {
     if (!(n % d)) { return(0) }
     d += 2
     if (!(n % d)) { return(0) }
     d += 4
   }
   return(1)

} function magnanimous(start,stop, count,i) {

   printf("%d-%d:",start,stop)
   for (i=0; count<stop; ++i) {
     if (is_magnanimous(i)) {
       if (++count >= start) {
         printf(" %d",i)
       }
     }
   }
   printf("\n")

} </lang>

Output:
1-45: 0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 58 61 65 67 70 74 76 83 85 89 92 94 98 101 110
241-250: 17992 19972 20209 20261 20861 22061 22201 22801 22885 24407
391-400: 486685 488489 515116 533176 551558 559952 595592 595598 600881 602081

C

Translation of: Go

<lang c>#include <stdio.h>

  1. include <string.h>

typedef int bool; typedef unsigned long long ull;

  1. define TRUE 1
  2. define FALSE 0

/* OK for 'small' numbers. */ bool is_prime(ull n) {

   ull d;
   if (n < 2) return FALSE;
   if (!(n % 2)) return n == 2;
   if (!(n % 3)) return n == 3;
   d = 5;
   while (d * d <= n) {
       if (!(n % d)) return FALSE;
       d += 2;
       if (!(n % d)) return FALSE;
       d += 4;
   }
   return TRUE;

}

void ord(char *res, int n) {

   char suffix[3];
   int m = n % 100;
   if (m >= 4 && m <= 20) {
       sprintf(res,"%dth", n);
       return;
   }
   switch(m % 10) {
       case 1:
           strcpy(suffix, "st");
           break;
       case 2:
           strcpy(suffix, "nd");
           break;
       case 3:
           strcpy(suffix, "rd");
           break;
       default:
           strcpy(suffix, "th");
           break;
   }
   sprintf(res, "%d%s", n, suffix);

}

bool is_magnanimous(ull n) {

   ull p, q, r;
   if (n < 10) return TRUE;
   for (p = 10; ; p *= 10) {
       q = n / p;
       r = n % p;
       if (!is_prime(q + r)) return FALSE;
       if (q < 10) break;
   }
   return TRUE;

}

void list_mags(int from, int thru, int digs, int per_line) {

   ull i = 0;
   int c = 0;
   char res1[13], res2[13];
   if (from < 2) {
       printf("\nFirst %d magnanimous numbers:\n", thru);
   } else {
       ord(res1, from);
       ord(res2, thru);
       printf("\n%s through %s magnanimous numbers:\n", res1, res2);
   }
   for ( ; c < thru; ++i) {
       if (is_magnanimous(i)) {
           if (++c >= from) {
               printf("%*llu ", digs, i);
               if (!(c % per_line)) printf("\n");
           }
       }
   }

}

int main() {

   list_mags(1, 45, 3, 15);
   list_mags(241, 250, 1, 10);
   list_mags(391, 400, 1, 10);
   return 0;

}</lang>

Output:
First 45 magnanimous numbers:
  0   1   2   3   4   5   6   7   8   9  11  12  14  16  20 
 21  23  25  29  30  32  34  38  41  43  47  49  50  52  56 
 58  61  65  67  70  74  76  83  85  89  92  94  98 101 110 

241st through 250th magnanimous numbers:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407 

391st through 400th magnanimous numbers:
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081 

C#

<lang csharp>using System; using static System.Console;

class Program {

 static bool[] np; // not-prime array
 static void ms(long lmt) { // populates array, a not-prime is true 
   np = new bool[lmt]; np[0] = np[1] = true;
   for (long n = 2, j = 1; n < lmt; n += j, j = 2) if (!np[n])
       for (long k = n * n; k < lmt; k += n) np[k] = true; }
 static bool is_Mag(long n) { long res, rem;
   for (long p = 10; n >= p; p *= 10) {
     res = Math.DivRem (n, p, out rem);
     if (np[res + rem]) return false; } return true; }
 static void Main(string[] args) { ms(100_009); string mn;
   WriteLine("First 45{0}", mn = " magnanimous numbers:");
   for (long l = 0, c = 0; c < 400; l++) if (is_Mag(l)) {
     if (c++ < 45 || (c > 240 && c <= 250) || c > 390)
       Write(c <= 45 ? "{0,4} " : "{0,8:n0} ", l);
     if (c < 45 && c % 15 == 0) WriteLine();
     if (c == 240) WriteLine ("\n\n241st through 250th{0}", mn);
     if (c == 390) WriteLine ("\n\n391st through 400th{0}", mn); } }

}</lang>

Output:
First 45 magnanimous numbers:
   0    1    2    3    4    5    6    7    8    9   11   12   14   16   20 
  21   23   25   29   30   32   34   38   41   43   47   49   50   52   56 
  58   61   65   67   70   74   76   83   85   89   92   94   98  101  110 

241st through 250th magnanimous numbers:
  17,992   19,972   20,209   20,261   20,861   22,061   22,201   22,801   22,885   24,407 

391st through 400th magnanimous numbers:
 486,685  488,489  515,116  533,176  551,558  559,952  595,592  595,598  600,881  602,081

C++

<lang cpp>#include <iomanip>

  1. include <iostream>

bool is_prime(unsigned int n) {

   if (n < 2)
       return false;
   if (n % 2 == 0)
       return n == 2;
   if (n % 3 == 0)
       return n == 3;
   for (unsigned int p = 5; p * p <= n; p += 4) {
       if (n % p == 0)
           return false;
       p += 2;
       if (n % p == 0)
           return false;
   }
   return true;

}

bool is_magnanimous(unsigned int n) {

   for (unsigned int p = 10; n >= p; p *= 10) {
       if (!is_prime(n % p + n / p))
           return false;
   }
   return true;

}

int main() {

   unsigned int count = 0, n = 0;
   std::cout << "First 45 magnanimous numbers:\n";
   for (; count < 45; ++n) {
       if (is_magnanimous(n)) {
           if (count > 0)
               std::cout << (count % 15 == 0 ? "\n" : ", ");
           std::cout << std::setw(3) << n;
           ++count;
       }
   }
   std::cout << "\n\n241st through 250th magnanimous numbers:\n";
   for (unsigned int i = 0; count < 250; ++n) {
       if (is_magnanimous(n)) {
           if (count++ >= 240) {
               if (i++ > 0)
                   std::cout << ", ";
               std::cout << n;
           }
       }
   }
   std::cout << "\n\n391st through 400th magnanimous numbers:\n";
   for (unsigned int i = 0; count < 400; ++n) {
       if (is_magnanimous(n)) {
           if (count++ >= 390) {
               if (i++ > 0)
                   std::cout << ", ";
               std::cout << n;
           }
       }
   }
   std::cout << '\n';
   return 0;

}</lang>

Output:
First 45 magnanimous numbers:
  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  11,  12,  14,  16,  20
 21,  23,  25,  29,  30,  32,  34,  38,  41,  43,  47,  49,  50,  52,  56
 58,  61,  65,  67,  70,  74,  76,  83,  85,  89,  92,  94,  98, 101, 110

241st through 250th magnanimous numbers:
17992, 19972, 20209, 20261, 20861, 22061, 22201, 22801, 22885, 24407

391st through 400th magnanimous numbers:
486685, 488489, 515116, 533176, 551558, 559952, 595592, 595598, 600881, 602081

F#

The function

This task uses Extensible Prime Generator (F#) <lang fsharp> // Generate Magnanimous numbers. Nigel Galloway: March 20th., 2020 let rec fN n g = match (g/n,g%n) with

                 (0,_)                    -> true
                |(α,β) when isPrime (α+β) -> fN (n*10) g
                |_                        -> false

let Magnanimous = let Magnanimous = fN 10 in seq{yield! {0..9}; yield! Seq.initInfinite id |> Seq.skip 10 |> Seq.filter Magnanimous} </lang>

The Tasks

First 45

<lang fsharp> Magnanimous |> Seq.take 45 |> Seq.iter (printf "%d "); printfn "" </lang>

Output:
0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 58 61 65 67 70 74 76 83 85 89 92 94 98 101 110
Magnanimous[241] to Magnanimous[250]

<lang fsharp> Magnanimous |> Seq.skip 240 |> Seq.take 10 |> Seq.iter (printf "%d "); printfn "";; </lang>

Output:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407
Magnanimous[391] to Magnanimous[400]

<lang fsharp> Magnanimous |> Seq.skip 390 |> Seq.take 10 |> Seq.iter (printf "%d "); printfn "";; </lang>

Output:
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081

Factor

Translation of: Julia
Works with: Factor version 0.99 2020-01-23

<lang factor>USING: grouping io kernel lists lists.lazy math math.functions math.primes math.ranges prettyprint sequences ;

magnanimous? ( n -- ? )
   dup 10 < [ drop t ] [
       dup log10 >integer [1,b] [ 10^ /mod + prime? not ] with
       find nip >boolean not
   ] if ;
magnanimous ( n -- seq )
   0 lfrom [ magnanimous? ] lfilter ltake list>array ;
show ( seq from to -- ) rot subseq 15 group simple-table. nl ;

400 magnanimous [ "First 45 magnanimous numbers" print 0 45 show ] [ "241st through 250th magnanimous numbers" print 240 250 show ] [ "391st through 400th magnanimous numbers" print 390 400 show ] tri</lang>

Output:
First 45 magnanimous numbers
0  1  2  3  4  5  6  7  8  9  11 12 14 16  20
21 23 25 29 30 32 34 38 41 43 47 49 50 52  56
58 61 65 67 70 74 76 83 85 89 92 94 98 101 110

241st through 250th magnanimous numbers
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407

391st through 400th magnanimous numbers
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081

Go

<lang go>package main

import "fmt"

// OK for 'small' numbers. func isPrime(n uint64) bool {

   switch {
   case n < 2:
       return false
   case n%2 == 0:
       return n == 2
   case n%3 == 0:
       return n == 3
   default:
       d := uint64(5)
       for d*d <= n {
           if n%d == 0 {
               return false
           }
           d += 2
           if n%d == 0 {
               return false
           }
           d += 4
       }
       return true
   }

}

func ord(n int) string {

   m := n % 100
   if m >= 4 && m <= 20 {
       return fmt.Sprintf("%dth", n)
   }
   m %= 10
   suffix := "th"
   if m < 4 {
       switch m {
       case 1:
           suffix = "st"
       case 2:
           suffix = "nd"
       case 3:
           suffix = "rd"
       }
   }
   return fmt.Sprintf("%d%s", n, suffix)

}

func isMagnanimous(n uint64) bool {

   if n < 10 {
       return true
   }
   for p := uint64(10); ; p *= 10 {
       q := n / p
       r := n % p
       if !isPrime(q + r) {
           return false
       }
       if q < 10 {
           break
       }
   }
   return true

}

func listMags(from, thru, digs, perLine int) {

   if from < 2 {
       fmt.Println("\nFirst", thru, "magnanimous numbers:")
   } else {
       fmt.Printf("\n%s through %s magnanimous numbers:\n", ord(from), ord(thru))
   }
   for i, c := uint64(0), 0; c < thru; i++ {
       if isMagnanimous(i) {
           c++
           if c >= from {
               fmt.Printf("%*d ", digs, i)
               if c%perLine == 0 {
                   fmt.Println()
               }
           }
       }
   }

}

func main() {

   listMags(1, 45, 3, 15)
   listMags(241, 250, 1, 10)
   listMags(391, 400, 1, 10)

}</lang>

Output:
First 45 magnanimous numbers:
  0   1   2   3   4   5   6   7   8   9  11  12  14  16  20 
 21  23  25  29  30  32  34  38  41  43  47  49  50  52  56 
 58  61  65  67  70  74  76  83  85  89  92  94  98 101 110 

241st through 250th magnanimous numbers:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407 

391st through 400th magnanimous numbers:
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081 

Java

<lang java> import java.util.ArrayList; import java.util.List;

public class MagnanimousNumbers {

   public static void main(String[] args) {
       runTask("Find and display the first 45 magnanimous numbers.", 1, 45);
       runTask("241st through 250th magnanimous numbers.", 241, 250);
       runTask("391st through 400th magnanimous numbers.", 391, 400);
   }
   
   private static void runTask(String message, int startN, int endN) {
       int count = 0;
       List<Integer> nums = new ArrayList<>();
       for ( int n = 0 ; count < endN ; n++ ) {
           if ( isMagnanimous(n) ) {
               nums.add(n);
               count++;
           }
       }
       System.out.printf("%s%n", message);
       System.out.printf("%s%n%n", nums.subList(startN-1, endN));
   }
   
   private static boolean isMagnanimous(long n) {
       if ( n >= 0 && n <= 9 ) {
           return true;
       }
       long q = 11;
       for ( long div = 10 ; q >= 10 ; div *= 10 ) {
           q = n / div;
           long r = n % div;
           if ( ! isPrime(q+r) ) {
               return false;
           }
       }
       return true;
   }
   
   private static final int MAX = 100_000;
   private static final boolean[] primes = new boolean[MAX];
   private static boolean SIEVE_COMPLETE = false;
   
   private static final boolean isPrimeTrivial(long test) {
       if ( ! SIEVE_COMPLETE ) {
           sieve();
           SIEVE_COMPLETE = true;
       }
       return primes[(int) test];
   }
   
   private static final void sieve() {
       //  primes
       for ( int i = 2 ; i < MAX ; i++ ) {
           primes[i] = true;            
       }
       for ( int i = 2 ; i < MAX ; i++ ) {
           if ( primes[i] ) {
               for ( int j = 2*i ; j < MAX ; j += i ) {
                   primes[j] = false;
               }
           }
       }
   }
   //  See http://primes.utm.edu/glossary/page.php?sort=StrongPRP
   public static final boolean isPrime(long testValue) {
       if ( testValue == 2 ) return true;
       if ( testValue % 2 == 0 ) return false;
       if ( testValue <= MAX ) return isPrimeTrivial(testValue);
       long d = testValue-1;
       int s = 0;
       while ( d % 2 == 0 ) {
           s += 1;
           d /= 2;
       }
       if ( testValue < 1373565L ) {
           if ( ! aSrp(2, s, d, testValue) ) {
               return false;
           }
           if ( ! aSrp(3, s, d, testValue) ) {
               return false;
           }
           return true;
       }
       if ( testValue < 4759123141L ) {
           if ( ! aSrp(2, s, d, testValue) ) {
               return false;
           }
           if ( ! aSrp(7, s, d, testValue) ) {
               return false;
           }
           if ( ! aSrp(61, s, d, testValue) ) {
               return false;
           }
           return true;
       }
       if ( testValue < 10000000000000000L ) {
           if ( ! aSrp(3, s, d, testValue) ) {
               return false;
           }
           if ( ! aSrp(24251, s, d, testValue) ) {
               return false;
           }
           return true;
       }
       //  Try 5 "random" primes
       if ( ! aSrp(37, s, d, testValue) ) {
           return false;
       }
       if ( ! aSrp(47, s, d, testValue) ) {
           return false;
       }
       if ( ! aSrp(61, s, d, testValue) ) {
           return false;
       }
       if ( ! aSrp(73, s, d, testValue) ) {
           return false;
       }
       if ( ! aSrp(83, s, d, testValue) ) {
           return false;
       }
       //throw new RuntimeException("ERROR isPrime:  Value too large = "+testValue);
       return true;
   }
   private static final boolean aSrp(int a, int s, long d, long n) {
       long modPow = modPow(a, d, n);
       //System.out.println("a = "+a+", s = "+s+", d = "+d+", n = "+n+", modpow = "+modPow);
       if ( modPow == 1 ) {
           return true;
       }
       int twoExpR = 1;
       for ( int r = 0 ; r < s ; r++ ) {
           if ( modPow(modPow, twoExpR, n) == n-1 ) {
               return true;
           }
           twoExpR *= 2;
       }
       return false;
   }
   
   private static final long SQRT = (long) Math.sqrt(Long.MAX_VALUE);
   
   public static final long modPow(long base, long exponent, long modulus) {
       long result = 1;
       while ( exponent > 0 ) {
           if ( exponent % 2 == 1 ) {
               if ( result > SQRT || base > SQRT ) {
                   result = multiply(result, base, modulus);
               }
               else {
                   result = (result * base) % modulus;
               }
           }
           exponent >>= 1;
           if ( base > SQRT ) {
               base = multiply(base, base, modulus);
           }
           else {
               base = (base * base) % modulus;
           }
       }
       return result;
   }


   //  Result is a*b % mod, without overflow.
   public static final long multiply(long a, long b, long modulus) {
       long x = 0;
       long y = a % modulus;
       long t;
       while ( b > 0 ) {
           if ( b % 2 == 1 ) {
               t = x + y;
               x = (t > modulus ? t-modulus : t);
           }
           t = y << 1;
           y = (t > modulus ? t-modulus : t);
           b >>= 1;
       }
       return x % modulus;
   }

} </lang>

Output:
Find and display the first 45 magnanimous numbers.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 16, 20, 21, 23, 25, 29, 30, 32, 34, 38, 41, 43, 47, 49, 50, 52, 56, 58, 61, 65, 67, 70, 74, 76, 83, 85, 89, 92, 94, 98, 101, 110]

241st through 250th magnanimous numbers.
[17992, 19972, 20209, 20261, 20861, 22061, 22201, 22801, 22885, 24407]

391st through 400th magnanimous numbers.
[486685, 488489, 515116, 533176, 551558, 559952, 595592, 595598, 600881, 602081]

J

   write_sum_expressions=: ([: }: ]\) ,"1 '+' ,"1 ([: }. ]\.)   NB. combine prefixes with suffixes
   interstitial_sums=: ".@write_sum_expressions@":
   primeQ=: 1&p:
   magnanimousQ=: 1:`([: *./ [: primeQ interstitial_sums)@.(>&9)
   A=: (#~ magnanimousQ&>) i.1000000       NB. filter 1000000 integers
   #A
434

   strange=: ({. + [: i. -~/)@:(_1 0&+) NB. produce index ranges for output
   I=: _2 <@strange\ 1 45 241 250 391 400
   I (":@:{~ >)~"0 _ A
0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 58 61 65 67 70 74 76 83 85 89 92 94 98 101 110
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407                                                                   
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081                                                         

jq

Works with: jq

Works with gojq, the Go implementation of jq

For a suitable definition of `is_prime`, see Erdős-primes#jq.

Preliminaries <lang jq># To take advantage of gojq's arbitrary-precision integer arithmetic: def power($b): . as $in | reduce range(0;$b) as $i (1; . * $in);

def divrem($x; $y):

 [$x/$y|floor, $x % $y];

</lang> The Task <lang jq> def ismagnanimous:

 . as $n
 | if $n < 10 then true
   else first(range( 1; tostring|length) as $i

| divrem($n; (10|power($i))) as [$q, $r]

              | if ($q + $r) | is_prime == false then 0 else empty end)
        // true
   | . == true
   end;
  1. An unbounded stream ...

def magnanimous:

 range(0; infinite)
 | select(ismagnanimous);

[limit(400; magnanimous)] | "First 45 magnanimous numbers:", .[:45],

 "\n241st through 250th magnanimous numbers:", .[241:251],
 "\n391st through 400th magnanimous numbers:", .[391:]</lang>
Output:
First 45 magnanimous numbers:
[0,1,2,3,4,5,6,7,8,9,11,12,14,16,20,21,23,25,29,30,32,34,38,41,43,47,49,50,52,56,58,61,65,67,70,74,76,83,85,89,92,94,98,101,110]

241st through 250th magnanimous numbers:
[19972,20209,20261,20861,22061,22201,22801,22885,24407,26201]

391st through 400th magnanimous numbers:
[488489,515116,533176,551558,559952,595592,595598,600881,602081]


Julia

<lang julia>using Primes

function ismagnanimous(n)

   n < 10 && return true
   for i in 1:ndigits(n)-1
       q, r = divrem(n, 10^i)
       !isprime(q + r) && return false
   end
   return true

end

function magnanimous(N)

   mvec, i = Int[], 0
   while length(mvec) < N
       if ismagnanimous(i)
           push!(mvec, i)
       end
       i += 1
   end
   return mvec

end

const mag400 = magnanimous(400) println("First 45 magnanimous numbers:\n", mag400[1:24], "\n", mag400[25:45]) println("\n241st through 250th magnanimous numbers:\n", mag400[241:250]) println("\n391st through 400th magnanimous numbers:\n", mag400[391:400])

</lang>

Output:
First 45 magnanimous numbers:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 16, 20, 21, 23, 25, 29, 30, 32, 34, 38, 41]
[43, 47, 49, 50, 52, 56, 58, 61, 65, 67, 70, 74, 76, 83, 85, 89, 92, 94, 98, 101, 110]

241st through 250th magnanimous numbers:
[17992, 19972, 20209, 20261, 20861, 22061, 22201, 22801, 22885, 24407]

391st through 400th magnanimous numbers:
[486685, 488489, 515116, 533176, 551558, 559952, 595592, 595598, 600881, 602081]

Mathematica/Wolfram Language

<lang Mathematica>Clear[MagnanimousNumberQ] MagnanimousNumberQ[Alternatives @@ Range[0, 9]] = True; MagnanimousNumberQ[n_Integer] := AllTrue[Range[IntegerLength[n] - 1], PrimeQ[Total[FromDigits /@ TakeDrop[IntegerDigits[n], #]]] &] sel = Select[Range[0, 1000000], MagnanimousNumberQ]; sel;; 45 sel241 ;; 250 sel391 ;; 400</lang>

Output:
{0,1,2,3,4,5,6,7,8,9,11,12,14,16,20,21,23,25,29,30,32,34,38,41,43,47,49,50,52,56,58,61,65,67,70,74,76,83,85,89,92,94,98,101,110}
{17992,19972,20209,20261,20861,22061,22201,22801,22885,24407}
{486685,488489,515116,533176,551558,559952,595592,595598,600881,602081}

Nim

<lang Nim>func isPrime(n: Natural): bool =

 if n < 2: return
 if n mod 2 == 0: return n == 2
 if n mod 3 == 0: return n == 3
 var d = 5
 while d * d <= n:
   if n mod d == 0: return false
   inc d, 2
   if n mod d == 0: return false
   inc d, 4
 return true


func isMagnanimous(n: Natural): bool =

 var p = 10
 while true:
   let a = n div p
   let b = n mod p
   if a == 0: break
   if not isPrime(a + b): return false
   p *= 10
 return true


iterator magnanimous(): (int, int) =

 var n, count = 0
 while true:
   if n.isMagnanimous:
     inc count
     yield (count, n)
   inc n


for (i, n) in magnanimous():

 if i in 1..45:
   if i == 1: stdout.write "First 45 magnanimous numbers:\n  "
   stdout.write n, if i == 45: '\n' else: ' '
 elif i in 241..250:
   if i == 241: stdout.write "\n241st through 250th magnanimous numbers:\n  "
   stdout.write n, if i == 250: "\n" else: "  "
 elif i in 391..400:
   if i == 391: stdout.write "\n391st through 400th magnanimous numbers:\n  "
   stdout.write n, if i == 400: "\n" else: "  "
 elif i > 400:
   break</lang>
Output:
First 45 magnanimous numbers:
  0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 58 61 65 67 70 74 76 83 85 89 92 94 98 101 110

241st through 250th magnanimous numbers:
  17992  19972  20209  20261  20861  22061  22201  22801  22885  24407

391st through 400th magnanimous numbers:
  486685  488489  515116  533176  551558  559952  595592  595598  600881  602081

Pascal

Works with: Free Pascal

Version nearly like on Talk. Generating the sieve for primes takes most of the time.
On TIO.RUN found all til 569 84448000009 in 19.171 s <lang pascal>program Magnanimous; //Magnanimous Numbers //algorithm find only numbers where all digits are even except the last //or where all digits are odd except the last //so 1,11,20,101,1001 will not be found //starting at 100001 "1>"+x"0"+"1" is not prime because of 1001 not prime {$IFDEF FPC}

 {$MODE DELPHI}
 {$Optimization ON}
 {$CODEALIGN proc=16}

{$ELSE}

 {$APPTYPE CONSOLE}

{$ENDIF} {$DEFINE USE_GMP} uses

 //strUtils, // commatize Numb2USA
 {$IFDEF USE_GMP}  gmp,{$ENDIF}
 SysUtils;

const

 MaxLimit = 100*1000*1000 +10;// 1e8  == MAXHIGHIDX = 7 
 MAXHIGHIDX = 11;

type

  tprimes = array of byte;
  tBaseType = word;
  tpBaseType = pWord;
  tBase =array[0..31] of tBaseType;
  tNumType = NativeUint;
  tSplitNum  =array[0..15] of tNumType;
  tMagList = array[0..1000] of Uint64;

var

 {$ALIGN 32}
 dgtBase5,
 dgtEvenBase10,
 dgtOddBase10: tbase;
 MagList : tMagList;
 primes : tprimes;
 {$IFDEF USE_GMP} z : mpz_t;gmp_count :NativeUint;{$ENDIF}
 pPrimes0 : pByte;
 T0: int64;
 HighIdx,lstIdx, cnt,num,MagIdx: NativeUint;
 procedure InsertSort(pMag:pUint64; Left, Right : NativeInt );
 var
   I, J: NativeInt;
   Pivot : Uint64;
 begin
   for i:= 1 + Left to Right do
   begin
     Pivot:= pMag[i];
     j:= i - 1;
     while (j >= Left) and (pMag[j] > Pivot) do
     begin
       pMag[j+1]:=pMag[j];
     Dec(j);
   end;
   pMag[j+1]:= pivot;
 end;

end;

function isprime(n: NativeUint):boolean; var

 k,flipflop: NativeUint;

Begin

 if Not(odd(n)) then
   EXIT(false);
 if n mod 3 = 0 then
   EXIT(false);
 k := 5;
 flipflop := 2;
 while k*k<=n do
 Begin
   if n mod k = 0 then
     EXIT(false);
   inc(k,flipflop);
   flipflop := 6-flipflop;
 end;
 EXIT(true);

end;

 procedure InitPrimes;
 const
   smallprimes :array[0..5] of byte = (2,3,5,7,11,13);
 var
   pPrimes : pByte;
   p,i,j,l : NativeUint;
 begin
   l := 1;
   for j := 0 to High(smallprimes) do
     l*= smallprimes[j];
   //scale primelimit to be multiple of l
   i :=((MaxLimit-1) DIV l+1)*l+1;//+1 should suffice
   setlength(primes,i);
   pPrimes := @primes[0];
   for j := 0 to High(smallprimes) do
   begin
     p := smallprimes[j];
     i := p;
     if j <> 0 then
       p +=p;
     while i <= l do
     begin
       pPrimes[i] := 1;
       inc(i,p)
     end;
   end;
   //turn the prime wheel
   for p := length(primes) div l -1 downto 1 do
     move(pPrimes[1],pPrimes[p*l+1],l);
   l := High(primes);
   //reinsert smallprimes
   for j := 0 to High(smallprimes) do
     pPrimes[smallprimes[j]] := 0;
   pPrimes[1]:=1;
   pPrimes[0]:=1;
   p := smallprimes[High(smallprimes)];
   repeat
     repeat
       inc(p)
     until pPrimes[p] = 0;
     j :=  l div p;
     while (pPrimes[j]<> 0) AND (j>=p) do
       dec(j);
     if j<p then
       BREAK;
     //delta  going downwards no factor 2,3 :-2 -4 -2 -4
     i := (j+1) mod 6;
     if i = 0 then
       i :=4;
     repeat
       while (pPrimes[j]<> 0) AND (j>=p) do
       begin
         dec(j,i);
         i := 6-i;
       end;
       if j<p then
         BREAK;
       pPrimes[j*p] := 1;
       dec(j,i);
       i := 6-i;
     until j<p;
   until false;
   pPrimes0 := pPrimes;
 end;
 procedure OutBase5;
 var
   pb: tpBaseType;
   i : NativeUint;
 begin
   pb:= @dgtBase5[0];
   write(num:15);
   for i := HighIdx downto 0 do
     write(pB[i]:2);
   write(#13);
 end;
 function IncDgtBase5:nativeUint;
 var
   pb: tpBaseType;
   num: nativeint;
 begin
   pb:= @dgtBase5[0];
   result := 0;
   repeat
     num := pb[result] + 1;
     if num < 5 then
     begin
       pb[result] := num;
       break;
     end;
     pb[result] := 0;
     Inc(result);
   until False;
   if HighIdx < result then
   begin
     HighIdx := result;
     pb[result] := 0;
   end;
 end;
 procedure CnvEvenBase10(lastIdx:NativeInt);
 var
   pdgt : tpBaseType;
   idx: nativeint;
 begin
   pDgt := @dgtEvenBase10[0];
   for idx := lastIdx downto 1 do
     pDgt[idx] := 2 * dgtBase5[idx];
   pDgt[0] := 2 * dgtBase5[0]+1;
 end;
 procedure CnvOddBase10(lastIdx:NativeInt);
 var
   pdgt : tpBaseType;
   idx: nativeint;
 begin
   pDgt := @dgtOddBase10[0];
   for idx := lastIdx downto 1 do
     pDgt[idx] := 2 * dgtBase5[idx] + 1;
   pDgt[0] := 2 * dgtBase5[0];
 end;
 function Base10toNum(var dgtBase10: tBase):NativeUint;
 var
   i : NativeInt;
 begin
   Result := 0;
   for i := HighIdx downto 0 do
     Result := Result * 10 + dgtBase10[i];
 end;
 procedure CheckMagn(var dgtBase10: tBase);
 //split number into sum of all "partitions" of digits
 //check if sum is always prime
 //1234 -> 1+234,12+34 ;123+4
 var
   LowSplitNum :tSplitNum;
   i,fac,n: NativeInt;
   isMagn : boolean;
 Begin
   n := 0;
   fac := 1;
   For i := 0 to HighIdx-1 do
   begin
     n := fac*dgtBase10[i]+n;
     fac *=10;
     LowSplitNum[HighIdx-1-i] := n;
   end;
   n := 0;
   fac := HighIdx;
   isMagn := true;
   For i := 0 to fac-1 do
   begin
     //n = HighSplitNum[i]
     n := n*10+dgtBase10[fac-i];
     LowSplitNum[i] += n;
     //test if not isMagn as soon as possible
     if LowSplitNum[i]<=MAXLIMIT then
     begin
       isMagn := isMagn AND (pPrimes0[LowSplitNum[i]] = 0);
       if NOT(isMagn) then
         EXIT;
     end;
   end;
   {$IFDEF USE_GMP}
   For i := 0 to fac-1 do
   begin
     n := LowSplitNum[i];
     if n >MAXLIMIT then
     Begin
       mpz_set_ui(z,n);
       gmp_count +=1;
       isMagn := isMagn AND (mpz_probab_prime_p(z,1) >0);
       if NOT(isMagn) then
         EXIT;
     end;
   end;
  {$ENDIF}
   //insert magnanimous numbers
   num := Base10toNum(dgtBase10);
   MagList[MagIdx] := num;
   inc(MagIdx);
   //OutBase5;
 end;

BEGIN

 {$IFDEF USE_GMP}mpz_init_set_ui(z,0);{$ENDIF}
 T0 := Gettickcount64;
 InitPrimes;
 T0 -= Gettickcount64;
 writeln('getting primes ',-T0 / 1000: 0: 3, ' s');
 T0 := Gettickcount64;
 fillchar(dgtBase5,SizeOf(dgtBase5),#0);
 fillchar(dgtEvenBase10,SizeOf(dgtEvenBase10),#0);
 fillchar(dgtOddBase10,SizeOf(dgtOddBase10),#0);

//Magnanimous Numbers that can not be found by this algorithm

 MagIdx := 0;
 MagList[MagIdx] := 1;inc(MagIdx);
 MagList[MagIdx] := 11;inc(MagIdx);
 MagList[MagIdx] := 20;inc(MagIdx);
 MagList[MagIdx] := 101;inc(MagIdx);
 MagList[MagIdx] := 1001;inc(MagIdx);
 {$IFDEF USE_GMP} mpz_init_set_ui(z,0);{$ENDIF}
 HighIdx := 0;
 lstIdx := 0;
 repeat
   if dgtBase5[highIdx] <> 0 then
   begin
     CnvEvenBase10(lstIdx);
     CheckMagn(dgtEvenBase10);
   end;
   CnvOddBase10(lstIdx);
   CheckMagn(dgtOddBase10);
   lstIdx := IncDgtBase5;
 until HighIdx > MAXHIGHIDX;
 writeln;
 InsertSort(@MagList[0],0,MagIdx-1);
 {$IFDEF USE_GMP} mpz_clear(z);writeln('Count of gmp tests ',gmp_count);{$ENDIF}
 For cnt := 0 to MagIdx-1 do
   writeln(cnt+1:3,'   ',MagList[cnt]);
 T0 -= Gettickcount64;
 writeln(-T0 / 1000: 0: 3, ' s');
 {$IFDEF WINDOWS}
   readln;
 {$ENDIF}

end. </lang>

Output:
TIO.RUN
getting primes 0.311 s

Count of gmp tests 102061
  1   0
  2   1
  3   2
  4   3
  5   4
  6   5
  7   6
  8   7
  9   8
 10   9
 11   11
 12   12
 13   14
 14   16
 15   20
 16   21
 17   23
 18   25
 19   29
 20   30
 21   32
 22   34
 23   38
 24   41
 25   43
 26   47
 27   49
 28   50
 29   52
 30   56
 31   58
 32   61
 33   65
 34   67
 35   70
 36   74
 37   76
 38   83
 39   85
 40   89
 41   92
 42   94
 43   98
 44   101
 45   110
 46   112
 47   116
 48   118
 49   130
 50   136
 51   152
 52   158
 53   170
 54   172
 55   203
 56   209
 57   221
 58   227
 59   229
 60   245
 61   265
 62   281
 63   310
 64   316
 65   334
 66   338
 67   356
 68   358
 69   370
 70   376
 71   394
 72   398
 73   401
 74   403
 75   407
 76   425
 77   443
 78   449
 79   467
 80   485
 81   512
 82   518
 83   536
 84   538
 85   554
 86   556
 87   574
 88   592
 89   598
 90   601
 91   607
 92   625
 93   647
 94   661
 95   665
 96   667
 97   683
 98   710
 99   712
100   730
101   736
102   754
103   772
104   776
105   790
106   794
107   803
108   809
109   821
110   845
111   863
112   881
113   889
114   934
115   938
116   952
117   958
118   970
119   974
120   992
121   994
122   998
123   1001
124   1112
125   1130
126   1198
127   1310
128   1316
129   1598
130   1756
131   1772
132   1910
133   1918
134   1952
135   1970
136   1990
137   2209
138   2221
139   2225
140   2249
141   2261
142   2267
143   2281
144   2429
145   2447
146   2465
147   2489
148   2645
149   2681
150   2885
151   3110
152   3170
153   3310
154   3334
155   3370
156   3398
157   3518
158   3554
159   3730
160   3736
161   3794
162   3934
163   3974
164   4001
165   4027
166   4063
167   4229
168   4247
169   4265
170   4267
171   4427
172   4445
173   4463
174   4643
175   4825
176   4883
177   5158
178   5176
179   5374
180   5516
181   5552
182   5558
183   5594
184   5752
185   5972
186   5992
187   6001
188   6007
189   6067
190   6265
191   6403
192   6425
193   6443
194   6485
195   6601
196   6685
197   6803
198   6821
199   7330
200   7376
201   7390
202   7394
203   7534
204   7556
205   7592
206   7712
207   7934
208   7970
209   8009
210   8029
211   8221
212   8225
213   8801
214   8821
215   9118
216   9172
217   9190
218   9338
219   9370
220   9374
221   9512
222   9598
223   9710
224   9734
225   9752
226   9910
227   11116
228   11152
229   11170
230   11558
231   11930
232   13118
233   13136
234   13556
235   15572
236   15736
237   15938
238   15952
239   17716
240   17752
241   17992
242   19972
243   20209
244   20261
245   20861
246   22061
247   22201
248   22801
249   22885
250   24407
251   26201
252   26285
253   26881
254   28285
255   28429
256   31370
257   31756
258   33118
259   33538
260   33554
261   35116
262   35776
263   37190
264   37556
265   37790
266   37930
267   39158
268   39394
269   40001
270   40043
271   40049
272   40067
273   40427
274   40463
275   40483
276   42209
277   42265
278   44009
279   44443
280   44447
281   46445
282   48089
283   48265
284   51112
285   53176
286   53756
287   53918
288   55516
289   55552
290   55558
291   55576
292   55774
293   57116
294   57754
295   60007
296   60047
297   60403
298   60443
299   60667
300   62021
301   62665
302   64645
303   66667
304   66685
305   68003
306   68683
307   71536
308   71572
309   71716
310   71752
311   73156
312   75374
313   75556
314   77152
315   77554
316   79330
317   79370
318   80009
319   80029
320   80801
321   80849
322   82265
323   82285
324   82825
325   82829
326   84265
327   86081
328   86221
329   88061
330   88229
331   88265
332   88621
333   91792
334   93338
335   93958
336   93994
337   99712
338   99998
339   111112
340   111118
341   111170
342   111310
343   113170
344   115136
345   115198
346   115772
347   117116
348   119792
349   135158
350   139138
351   151156
352   151592
353   159118
354   177556
355   193910
356   199190
357   200209
358   200809
359   220021
360   220661
361   222245
362   224027
363   226447
364   226681
365   228601
366   282809
367   282881
368   282889
369   311156
370   319910
371   331118
372   333770
373   333994
374   335156
375   339370
376   351938
377   359794
378   371116
379   373130
380   393554
381   399710
382   400049
383   404249
384   408049
385   408889
386   424607
387   440843
388   464447
389   484063
390   484445
391   486685
392   488489
393   515116
394   533176
395   551558
396   559952
397   595592
398   595598
399   600881
400   602081
401   626261
402   628601
403   644485
404   684425
405   686285
406   711512
407   719710
408   753316
409   755156
410   773554
411   777712
412   777776
413   799394
414   799712
415   800483
416   802061
417   802081
418   804863
419   806021
420   806483
421   806681
422   822265
423   864883
424   888485
425   888601
426   888643
427   911390
428   911518
429   915752
430   931130
431   975772
432   979592
433   991118
434   999994
435   1115756
436   1137770
437   1191518
438   1197370
439   1353136
440   1379930
441   1533736
442   1593538
443   1711576
444   1791110
445   1795912
446   1915972
447   1951958
448   2000221
449   2008829
450   2442485
451   2604067
452   2606647
453   2664425
454   2666021
455   2828809
456   2862445
457   3155116
458   3171710
459   3193198
460   3195338
461   3195398
462   3315358
463   3373336
464   3573716
465   3737534
466   3751576
467   3939118
468   4000483
469   4408603
470   4468865
471   4488245
472   4644407
473   5115736
474   5357776
475   5551376
476   5579774
477   5731136
478   5759594
479   5959774
480   6462667
481   6600227
482   6600443
483   6608081
484   6640063
485   6640643
486   6824665
487   6864485
488   6866683
489   7113710
490   7133110
491   7139390
492   7153336
493   7159172
494   7311170
495   7351376
496   7719370
497   7959934
498   7979534
499   8044009
500   8068201
501   8608081
502   8844449
503   9171170
504   9777910
505   9959374
506   11771992
507   13913170
508   15177112
509   17115116
510   19337170
511   19713130
512   20266681
513   22086821
514   22600601
515   22862885
516   26428645
517   28862465
518   33939518
519   37959994
520   40866083
521   44866043
522   48606043
523   48804809
524   51137776
525   51513118
526   53151376
527   53775934
528   59593574
529   60402247
530   60860603
531   62202281
532   64622665
533   66864625
534   66886483
535   71553536
536   77917592
537   82486825
538   86842265
539   91959398
540   95559998
541   117711170
542   222866845
543   228440489
544   244064027
545   280422829
546   331111958
547   400044049
548   460040803
549   511151552
550   593559374
551   606202627
552   608844043
553   622622801
554   622888465
555   773719910
556   844460063
557   882428665
558   995955112
559   1777137770
560   2240064227
561   2444402809
562   5753779594
563   6464886245
564   9151995592
565   22226226625
566   31993717930
567   39393115598
568   46884486265
569   84448000009
19.171 s

Real time: 19.793 s User time: 19.520 s Sys. time: 0.095 s CPU share: 99.09 %

Perl

Translation of: Raku
Library: ntheory

<lang perl>use strict; use warnings; use feature 'say'; use ntheory 'is_prime';

sub magnanimous {

   my($n) = @_;
   my $last;
   for my $c (1 .. length($n) - 1) {
       ++$last and last unless is_prime substr($n,0,$c) + substr($n,$c)
   }
   not $last;

}

my @M; for ( my $i = 0, my $count = 0; $count < 400; $i++ ) {

   ++$count and push @M, $i if magnanimous($i);

}

say "First 45 magnanimous numbers\n".

   (sprintf "@{['%4d' x 45]}", @M[0..45-1]) =~ s/(.{60})/$1\n/gr;

say "241st through 250th magnanimous numbers\n" .

   join ' ', @M[240..249];

say "\n391st through 400th magnanimous numbers\n".

   join ' ', @M[390..399];</lang>
Output:
First 45 magnanimous numbers
   0   1   2   3   4   5   6   7   8   9  11  12  14  16  20
  21  23  25  29  30  32  34  38  41  43  47  49  50  52  56
  58  61  65  67  70  74  76  83  85  89  92  94  98 101 110

241st through 250th magnanimous numbers
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407

391st through 400th magnanimous numbers
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081

Phix

with javascript_semantics 
function magnanimous(integer n)
    integer p = 1, r = 0
    while n>=10 do
        r += remainder(n,10)*p
        n = floor(n/10)
        if not is_prime(n+r) then return false end if
        p *= 10
    end while
    return true
end function
 
sequence mag = {}
integer n = 0
while length(mag)<400 do
    if magnanimous(n) then mag &= n end if
    n += 1
end while
puts(1,"First 45 magnanimous numbers: ") pp(mag[1..45],{pp_Indent,30,pp_IntCh,false,pp_Maxlen,100})
printf(1,"magnanimous numbers[241..250]: %v\n", {mag[241..250]})
printf(1,"magnanimous numbers[391..400]: %v\n", {mag[391..400]})
Output:
First 45 magnanimous numbers: {0,1,2,3,4,5,6,7,8,9,11,12,14,16,20,21,23,25,29,30,32,34,38,41,43,
                               47,49,50,52,56,58,61,65,67,70,74,76,83,85,89,92,94,98,101,110}
magnanimous numbers[241..250]: {17992,19972,20209,20261,20861,22061,22201,22801,22885,24407}
magnanimous numbers[391..400]: {486685,488489,515116,533176,551558,559952,595592,595598,600881,602081}

PicoLisp

<lang PicoLisp>(de **Mod (X Y N)

  (let M 1
     (loop
        (when (bit? 1 Y)
           (setq M (% (* M X) N)) )
        (T (=0 (setq Y (>> 1 Y)))
           M )
        (setq X (% (* X X) N)) ) ) )

(de isprime (N)

  (cache '(NIL) N
     (if (== N 2)
        T
        (and
           (> N 1)
           (bit? 1 N)
           (let (Q (dec N)  N1 (dec N)  K 0  X)
              (until (bit? 1 Q)
                 (setq
                    Q (>> 1 Q)
                    K (inc K) ) )
              (catch 'composite
                 (do 16
                    (loop
                       (setq X
                          (**Mod
                             (rand 2 (min (dec N) 1000000000000))
                             Q
                             N ) )
                       (T (or (=1 X) (= X N1)))
                       (T
                          (do K
                             (setq X (**Mod X 2 N))
                             (when (=1 X) (throw 'composite))
                             (T (= X N1) T) ) )
                       (throw 'composite) ) )
                 (throw 'composite T) ) ) ) ) ) )

(de numbers (N)

  (let (P 10  Q N)
     (make
        (until (> 10 Q)
           (link
              (+
                 (setq Q (/ N P))
                 (% N P) ) )
           (setq P (* P 10)) ) ) ) )

(de ismagna (N)

  (or 
     (> 10 N)
     (fully isprime (numbers N)) ) )

(let (C 0 N 0 Lst)

  (setq Lst
     (make
        (until (== C 401)
           (when (ismagna N)
              (link N)
              (inc 'C) )
           (inc 'N) ) ) )
  (println (head 45 Lst))
  (println (head 10 (nth Lst 241)))
  (println (head 10 (nth Lst 391))) )</lang>
Output:
(0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 58 61 65 67 70 74 76 83 85 89 92 94 98 101 110)
(17992 19972 20209 20261 20861 22061 22201 22801 22885 24407)
(486685 488489 515116 533176 551558 559952 595592 595598 600881 602081)

PL/M

This sample can be compiled with the original 8080 PL/M compiler and run under CP/M (or a clone/emulator).
THe original 8080 PL/M only supports 8 and 16 bit quantities, so this only shows magnanimous numbers up to the 250th. <lang plm>100H: /* FIND SOME MAGNANIMOUS NUMBERS - THOSE WHERE INSERTING '+' BETWEEN */

  /* ANY TWO OF THE DIGITS AND EVALUATING THE SUM RESULTS IN A PRIME       */
  BDOS: PROCEDURE( FN, ARG ); /* CP/M BDOS SYSTEM CALL */
     DECLARE FN BYTE, ARG ADDRESS;
     GOTO 5;
  END BDOS;
  PRINT$CHAR:   PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C );    END;
  PRINT$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END;
  PRINT$NL:     PROCEDURE; CALL PRINT$STRING( .( 0DH, 0AH, '$' ) );   END;
  PRINT$NUMBER: PROCEDURE( N );
     DECLARE N ADDRESS;
     DECLARE V ADDRESS, N$STR( 6 ) BYTE, W BYTE;
     V = N;
     W = LAST( N$STR );
     N$STR( W ) = '$';
     N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
     DO WHILE( ( V := V / 10 ) > 0 );
        N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
     END;
     IF N < 100 THEN DO;
        IF N < 10 THEN CALL PRINT$CHAR( ' ' );
        CALL PRINT$CHAR( ' ' );
     END;
     CALL PRINT$STRING( .N$STR( W ) );
  END PRINT$NUMBER;
  /* INTEGER SQUARE ROOT: BASED ON THE ONE IN THE PL/M FROBENIUS NUMBERS */
  SQRT: PROCEDURE( N )ADDRESS;
     DECLARE ( N, X0, X1 ) ADDRESS;
     IF N <= 3 THEN DO;
         IF N = 0 THEN X0 = 0; ELSE X0 = 1;
         END;
     ELSE DO;
        X0 = SHR( N, 1 );
        DO WHILE( ( X1 := SHR( X0 + ( N / X0 ), 1 ) ) < X0 );
           X0 = X1;
        END;
     END;
     RETURN X0;
  END SQRT;
  DECLARE MAGNANIMOUS (251)ADDRESS; /* MAGNANIMOUS NUMBERS              */
  DECLARE FALSE           LITERALLY '0';
  DECLARE TRUE            LITERALLY '0FFH';
  /* TO FIND MAGNANIMOUS NUMBERS UP TO 30$000, WE NEED TO FIND PRIMES   */
  /* UP TO 9$999 + 9 = 10$008                                           */
  DECLARE MAX$PRIME       LITERALLY '10$008';
  DECLARE DCL$PRIME       LITERALLY '10$009';
  /* SIEVE THE PRIMES TO MAX$PRIME */
  DECLARE ( I, S ) ADDRESS;
  DECLARE PRIME ( DCL$PRIME )BYTE;
  PRIME( 1 ) = FALSE; PRIME( 2 ) = TRUE;
  DO I = 3 TO LAST( PRIME ) BY 2; PRIME( I ) = TRUE;  END;
  DO I = 4 TO LAST( PRIME ) BY 2; PRIME( I ) = FALSE; END;
  DO I = 3 TO SQRT( MAX$PRIME );
     IF PRIME( I ) THEN DO;
        DO S = I * I TO LAST( PRIME ) BY I + I;PRIME( S ) = FALSE; END;
     END;
  END;
  /* FIND THE MAGNANIMOUS NUMBERS                                       */
  FIND$MAGNANIMOUS: PROCEDURE;
     DECLARE ( D1, D2, D3, D4, D5
             , D12, D123, D1234
             , D23, D234, D2345
             , D34, D345, D45
             ) ADDRESS;
     DECLARE M$COUNT ADDRESS; /* COUNT OF MAGNANIMOUS NUMBERS FOUND     */
     STORE$MAGNANIMOUS: PROCEDURE( N )BYTE;
        DECLARE N ADDRESS;
        M$COUNT = M$COUNT + 1;
        IF M$COUNT <= LAST( MAGNANIMOUS ) THEN MAGNANIMOUS( M$COUNT ) = N;
        RETURN M$COUNT <= LAST( MAGNANIMOUS );
     END STORE$MAGNANIMOUS;
     M$COUNT = 0;
     /* 1 DIGIT MAGNANIMOUS NUMBERS                                        */
     DO D1 = 0 TO 9; IF NOT STORE$MAGNANIMOUS( D1 ) THEN RETURN; END;
     /* 2 DIGIT MAGNANIMOUS NUMBERS                                        */
     DO D1 = 1 TO 9;
        DO D2 = 0 TO 9;
           IF PRIME( D1 + D2 ) THEN DO;
              IF NOT STORE$MAGNANIMOUS( ( D1 * 10 ) + D2 ) THEN RETURN;
           END;
        END;
     END;
     /* 3 DIGIT MAGNANIMOUS NUMBERS                                        */
     DO D1 = 1 TO 9;
        DO D23 = 0 TO 99;
           IF PRIME( D1 + D23 ) THEN DO;
              D3  = D23 MOD 10;
              D12 = ( D1 * 10 ) + ( D23 / 10 );
              IF PRIME( D12 + D3 ) THEN DO;
                 IF NOT STORE$MAGNANIMOUS( ( D12 * 10 ) + D3 ) THEN RETURN;
              END;
           END;
        END;
     END;
     /* 4 DIGIT MAGNANIMOUS NUMBERS                                     */
     DO D12 = 10 TO 99;
        DO D34 = 0 TO 99;
           IF PRIME( D12 + D34 ) THEN DO;
              D123 = ( D12 * 10 ) + ( D34 / 10 );
              D4   = D34 MOD 10;
              IF PRIME( D123 + D4 ) THEN DO;
                 D1   = D12 / 10;
                 D234 = ( ( D12 MOD 10 ) * 100 ) + D34;
                 IF PRIME( D1 + D234 ) THEN DO;
                    IF NOT STORE$MAGNANIMOUS( ( D12 * 100 ) + D34 )
                       THEN RETURN;
                 END;
              END;
           END;
        END;
     END;
     /* 5 DIGIT MAGNANIMOUS NUMBERS UP TO 30$000                        */
     DO D12 = 10 TO 30;
        DO D345 = 0 TO 999;
           IF PRIME( D12 + D345 ) THEN DO;
              D123 = ( D12 * 10 ) + ( D345 / 100 );
              D45  = D345 MOD 100;
              IF PRIME( D123 + D45 ) THEN DO;
                 D1234 = ( D123 * 10 ) + ( D45 / 10 );
                 D5    = D45 MOD 10;
                 IF PRIME( D1234 + D5 ) THEN DO;
                    D1    = D12 / 10;
                    D2345 = ( ( D12 MOD 10 ) * 1000 ) + D345;
                    IF PRIME( D1 + D2345 ) THEN DO;
                       IF NOT STORE$MAGNANIMOUS( ( D12 * 1000 ) + D345 )
                          THEN RETURN;
                    END;
                 END;
              END;
           END;
        END;
     END;
  END FIND$MAGNANIMOUS ;
  CALL FIND$MAGNANIMOUS;
  DO I = 1 TO LAST( MAGNANIMOUS );
     IF I = 1 THEN DO;
        CALL PRINT$STRING( .'MAGNANIMOUS NUMBERS 1-45:$' ); CALL PRINT$NL;
        CALL PRINT$NUMBER( MAGNANIMOUS( I ) );
        END;
     ELSE IF I < 46 THEN DO;
        IF I MOD 15 = 1 THEN CALL PRINT$NL; ELSE CALL PRINT$CHAR( ' ' );
        CALL PRINT$NUMBER( MAGNANIMOUS( I ) );
        END;
     ELSE IF I = 241 THEN DO;
        CALL PRINT$NL;
        CALL PRINT$STRING( .'MAGANIMOUS NUMBERS 241-250:$' ); CALL PRINT$NL;
        CALL PRINT$NUMBER( MAGNANIMOUS( I ) );
        END;
     ELSE IF I > 241 AND I <= 250 THEN DO;
        CALL PRINT$CHAR( ' ' );
        CALL PRINT$NUMBER( MAGNANIMOUS( I ) );
     END;
  END;
  CALL PRINT$NL;

EOF</lang>

Output:
MAGNANIMOUS NUMBERS 1-45:
  0   1   2   3   4   5   6   7   8   9  11  12  14  16  20
 21  23  25  29  30  32  34  38  41  43  47  49  50  52  56
 58  61  65  67  70  74  76  83  85  89  92  94  98 101 110
MAGANIMOUS NUMBERS 241-250:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407

Raku

Works with: Rakudo version 2020.02

<lang perl6>my @magnanimous = lazy flat ^10, (10 .. 1001).map( {

   my int $last;
   (1 ..^ .chars).map: -> \c { $last = 1 and last unless (.substr(0,c) + .substr(c)).is-prime }
   next if $last;
   $_

} ),

(1002 .. ∞).map: {

    # optimization for numbers > 1001; First and last digit can not both be even or both be odd
   next if (.substr(0,1) + .substr(*-1)) %% 2;
   my int $last;
   (1 ..^ .chars).map: -> \c { $last = 1 and last unless (.substr(0,c) + .substr(c)).is-prime }
   next if $last;
   $_

}

put 'First 45 magnanimous numbers'; put @magnanimous[^45]».fmt('%3d').batch(15).join: "\n";

put "\n241st through 250th magnanimous numbers"; put @magnanimous[240..249];

put "\n391st through 400th magnanimous numbers"; put @magnanimous[390..399];</lang>

Output:
First 45 magnanimous numbers
  0   1   2   3   4   5   6   7   8   9  11  12  14  16  20
 21  23  25  29  30  32  34  38  41  43  47  49  50  52  56
 58  61  65  67  70  74  76  83  85  89  92  94  98 101 110

241st through 250th magnanimous numbers
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407

391st through 400th magnanimous numbers
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081

REXX

The majority of the time consumed was in generating a list (sparse array) of suitable primes.
The magna function (magnanimous) was quite simple to code and pretty fast, it includes the 1st and last digit parity test.
By far, the most CPU time was in the generation of primes. <lang REXX>/*REXX pgm finds/displays magnanimous #s (#s with a inserted + sign to sum to a prime).*/ parse arg bet.1 bet.2 bet.3 highP . /*obtain optional arguments from the CL*/ if bet.1== | bet.1=="," then bet.1= 1..45 /* " " " " " " */ if bet.2== | bet.2=="," then bet.2= 241..250 /* " " " " " " */ if bet.3== | bet.3=="," then bet.3= 391..400 /* " " " " " " */ if highP== | highP=="," then highP= 1000000 /* " " " " " " */ call genP /*gen primes up to highP (1 million).*/

    do j=1  for 3                               /*process three magnanimous "ranges".  */
    parse var   bet.j   LO  '..'  HI            /*obtain the first range (if any).     */
    if HI==  then HI= LO                      /*Just a single number?   Then use LO. */
    if HI==0   then iterate                     /*Is HI a zero?   Then skip this range.*/
    finds= 0;                             $=    /*#:  magnanimous # cnt;  $:  is a list*/
               do k=0  until finds==HI          /* [↓]  traipse through the number(s). */
               if \magna(k)  then iterate       /*Not magnanimous?  Then skip this num.*/
               finds= finds + 1                 /*bump the magnanimous number count.   */
               if finds>=LO  then $= $ k        /*In range►  Then add number ──► $ list*/
               end   /*k*/
    say
    say center(' 'LO       "──►"       HI       'magnanimous numbers ',  126, "─")
    say strip($)
    end        /*j*/

exit 0 /*stick a fork in it, we're all done. */ /*──────────────────────────────────────────────────────────────────────────────────────*/ magna: procedure expose @. !.; parse arg x 1 L 2 -1 R /*obtain #, 1st & last digit.*/

      len= length(x);       if len==1  then return 1     /*one digit #s are magnanimous*/
      if x>1001  then if L//2 == R//2  then return 0     /*Has parity?  Not magnanimous*/
               do  s= 1  for  len-1                      /*traipse thru #, inserting + */
               parse var  x   y  +(s)  z;   sum= y + z   /*parse 2 parts of #, sum 'em.*/
               if !.sum  then iterate                    /*Is sum prime? So far so good*/
                         else return 0                   /*Nope?  Then not magnanimous.*/
               end   /*s*/
      return 1                                  /*Pass all the tests, it's magnanimous.*/

/*──────────────────────────────────────────────────────────────────────────────────────*/ genP: @.1=2; @.2=3; @.3=5; @.4=7; @.5=11; @.6=13 /*assign low primes; # primes.*/

     !.= 0; !.2=1; !.3=1; !.5=1; !.7=1; !.11=1; !.13=1   /*   "   semaphores to   "    */
                          #= 6;  sq.#= @.# ** 2          /*# primes so far;  P squared.*/
       do j=@.#+4  by 2  to highP; parse var j  -1 _; if _==5  then iterate /*÷ by 5?*/
       if j// 3==0  then iterate;   if j// 7==0  then iterate    /*÷ by 3?;     ÷ by 7?*/
       if j//11==0  then iterate                                 /*"  " 11?     " " 13?*/
               do k=6  while sq.k<=j            /*divide by some generated odd primes. */
               if j//@.k==0  then iterate j     /*Is J divisible by  P?  Then not prime*/
               end   /*k*/                      /* [↓]  a prime  (J)  has been found.  */
       #= #+1;   @.#= j;   sq.#= j*j;   !.j= 1  /*bump #Ps; P──►@.assign P; P^2; P flag*/
       end     /*j*/;                 return</lang>
output   when using the default inputs:
──────────────────────────────────────────────── 1 ──► 45 magnanimous numbers ────────────────────────────────────────────────
0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 58 61 65 67 70 74 76 83 85 89 92 94 98 101 110
and took 0.00 seconds.


────────────────────────────────────────────── 241 ──► 250 magnanimous numbers ───────────────────────────────────────────────
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407
and took 0.31 seconds.


────────────────────────────────────────────── 391 ──► 400 magnanimous numbers ───────────────────────────────────────────────
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081

Ring

<lang ring> load "stdlib.ring" n = -1 sum = 0 magn = []

while sum < 45

     n = n + 1
     if n < 10
        add(magn,n)
        sum = sum + 1
     else   
        nStr = string(n)
        check = 0
        for m = 1 to len(nStr)-1
            nr1 = number(left(nStr,m))
            nr2 = number(right(nStr,len(nStr)-m))
            nr3 = nr1 + nr2
            if not isprime(nr3)
               check = 1
            ok
         next
         if check = 0
            add(magn,n)
            sum = sum + 1
         ok
      ok

end

see "Magnanimous numbers 1-45:" + nl showArray(magn)

n = -1 sum = 0 magn = []

while sum < 250

     n = n + 1
     if n < 10
        sum = sum + 1
     else   
        nStr = string(n)
        check = 0
        for m = 1 to len(nStr)-1
            nr1 = number(left(nStr,m))
            nr2 = number(right(nStr,len(nStr)-m))
            nr3 = nr1 + nr2
            if not isprime(nr3)
               check = 1
            ok
         next 
         if check = 0
            sum = sum + 1
         ok
         if check = 0 and sum > 240 and sum < 251
            add(magn,n)
         ok
      ok       

end

see nl see "Magnanimous numbers 241-250:" + nl showArray(magn)

func showArray array

    txt = ""
    see "["
    for n = 1 to len(array)
        txt = txt + array[n] + ","
    next
    txt = left(txt,len(txt)-1)
    txt = txt + "]"
    see txt

</lang>

Magnanimous numbers 1-45:
[0,1,2,3,4,5,6,7,8,9,11,12,14,16,20,21,23,25,29,30,32,34,38,41,43,47,49,50,52,56,58,61,65,67,70,74,76,83,85,89,92,94,98,101,110]

Magnanimous numbers 241-250:
[17992,19972,20209,20261,20861,22061,22201,22801,22885,24407]

Ruby

Translation of: Sidef

<lang ruby>require "prime"

magnanimouses = Enumerator.new do |y|

 (0..).each {|n| y << n if (1..n.digits.size-1).all? {|k| n.divmod(10**k).sum.prime?} }

end

puts "First 45 magnanimous numbers:" puts magnanimouses.first(45).join(' ')

puts "\n241st through 250th magnanimous numbers:" puts magnanimouses.first(250).last(10).join(' ')

puts "\n391st through 400th magnanimous numbers:" puts magnanimouses.first(400).last(10).join(' ') </lang>

Output:
First 45 magnanimous numbers:
0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 58 61 65 67 70 74 76 83 85 89 92 94 98 101 110

241st through 250th magnanimous numbers:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407

391st through 400th magnanimous numbers:
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081

Rust

<lang rust>fn is_prime(n: u32) -> bool {

   if n < 2 {
       return false;
   }
   if n % 2 == 0 {
       return n == 2;
   }
   if n % 3 == 0 {
       return n == 3;
   }
   let mut p = 5;
   while p * p <= n {
       if n % p == 0 {
           return false;
       }
       p += 2;
       if n % p == 0 {
           return false;
       }
       p += 4;
   }
   true

}

fn is_magnanimous(n: u32) -> bool {

   let mut p: u32 = 10;
   while n >= p {
       if !is_prime(n % p + n / p) {
           return false;
       }
       p *= 10;
   }
   true

}

fn main() {

   let mut m = (0..).filter(|x| is_magnanimous(*x)).take(400);
   println!("First 45 magnanimous numbers:");
   for (i, n) in m.by_ref().take(45).enumerate() {
       if i > 0 && i % 15 == 0 {
           println!();
       }
       print!("{:3} ", n);
   }
   println!("\n\n241st through 250th magnanimous numbers:");
   for n in m.by_ref().skip(195).take(10) {
       print!("{} ", n);
   }
   println!("\n\n391st through 400th magnanimous numbers:");
   for n in m.by_ref().skip(140) {
       print!("{} ", n);
   }
   println!();

}</lang>

Output:
First 45 magnanimous numbers:
  0   1   2   3   4   5   6   7   8   9  11  12  14  16  20 
 21  23  25  29  30  32  34  38  41  43  47  49  50  52  56 
 58  61  65  67  70  74  76  83  85  89  92  94  98 101 110 

241st through 250th magnanimous numbers:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407 

391st through 400th magnanimous numbers:
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081 

Sidef

<lang ruby>func is_magnanimous(n) {

   1..n.ilog10 -> all {|k|
       sum(divmod(n, k.ipow10)).is_prime
   }

}

say "First 45 magnanimous numbers:" say is_magnanimous.first(45).join(' ')

say "\n241st through 250th magnanimous numbers:" say is_magnanimous.first(250).last(10).join(' ')

say "\n391st through 400th magnanimous numbers:" say is_magnanimous.first(400).last(10).join(' ')</lang>

Output:
First 45 magnanimous numbers:
0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 58 61 65 67 70 74 76 83 85 89 92 94 98 101 110

241st through 250th magnanimous numbers:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407

391st through 400th magnanimous numbers:
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081

Swift

Translation of: Rust

<lang swift>import Foundation

func isPrime(_ n: Int) -> Bool {

   if n < 2 {
       return false
   }
   if n % 2 == 0 {
       return n == 2
   }
   if n % 3 == 0 {
       return n == 3
   }
   var p = 5
   while p * p <= n {
       if n % p == 0 {
           return false
       }
       p += 2
       if n % p == 0 {
           return false
       }
       p += 4
   }
   return true

}

func isMagnanimous(_ n: Int) -> Bool {

   var p = 10;
   while n >= p {
       if !isPrime(n % p + n / p) {
           return false
       }
       p *= 10
   }
   return true

}

let m = (0...).lazy.filter{isMagnanimous($0)}.prefix(400); print("First 45 magnanimous numbers:"); for (i, n) in m.prefix(45).enumerated() {

   if i > 0 && i % 15 == 0 {
       print()
   }
   print(String(format: "%3d", n), terminator: " ")

} print("\n\n241st through 250th magnanimous numbers:"); for n in m.dropFirst(240).prefix(10) {

   print(n, terminator: " ")

} print("\n\n391st through 400th magnanimous numbers:"); for n in m.dropFirst(390) {

   print(n, terminator: " ")

} print()</lang>

Output:
First 45 magnanimous numbers:
  0   1   2   3   4   5   6   7   8   9  11  12  14  16  20 
 21  23  25  29  30  32  34  38  41  43  47  49  50  52  56 
 58  61  65  67  70  74  76  83  85  89  92  94  98 101 110 

241st through 250th magnanimous numbers:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407 

391st through 400th magnanimous numbers:
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081 

Visual Basic .NET

Translation of: C#

<lang vbnet>Imports System, System.Console

Module Module1

   Dim np As Boolean()
   Sub ms(ByVal lmt As Long)
       np = New Boolean(CInt(lmt)) {} : np(0) = True : np(1) = True
       Dim n As Integer = 2, j As Integer = 1 : While n < lmt
           If Not np(n) Then
               Dim k As Long = CLng(n) * n
               While k < lmt : np(CInt(k)) = True : k += n : End While
           End If : n += j : j = 2 : End While
   End Sub
   Function is_Mag(ByVal n As Integer) As Boolean
       Dim res, rm As Integer, p As Integer = 10
       While n >= p
           res = Math.DivRem(n, p, rm)
           If np(res + rm) Then Return False
           p = p * 10 : End While : Return True
   End Function
   Sub Main(ByVal args As String())
       ms(100_009) : Dim mn As String = " magnanimous numbers:"
       WriteLine("First 45{0}", mn) : Dim l As Integer = 0, c As Integer = 0
       While c < 400 : If is_Mag(l) Then
           c += 1 : If c <= 45 OrElse (c > 240 AndAlso c <= 250) OrElse c > 390 Then Write(If(c <= 45, "{0,4} ", "{0,8:n0} "), l)
           If c < 45 AndAlso c Mod 15 = 0 Then WriteLine()
           If c = 240 Then WriteLine(vbLf & vbLf & "241st through 250th{0}", mn)
           If c = 390 Then WriteLine(vbLf & vbLf & "391st through 400th{0}", mn)
       End If : l += 1 : End While
   End Sub

End Module</lang>

Output:
First 45 magnanimous numbers:
   0    1    2    3    4    5    6    7    8    9   11   12   14   16   20 
  21   23   25   29   30   32   34   38   41   43   47   49   50   52   56 
  58   61   65   67   70   74   76   83   85   89   92   94   98  101  110 

241st through 250th magnanimous numbers:
  17,992   19,972   20,209   20,261   20,861   22,061   22,201   22,801   22,885   24,407 

391st through 400th magnanimous numbers:
 486,685  488,489  515,116  533,176  551,558  559,952  595,592  595,598  600,881  602,081 

Wren

Library: Wren-fmt
Library: Wren-math
Translation of: Go

<lang ecmascript>import "/fmt" for Conv, Fmt import "/math" for Int

var isMagnanimous = Fn.new { |n|

   if (n < 10) return true
   var p = 10
   while (true) {
       var q = (n/p).floor
       var r = n % p
       if (!Int.isPrime(q + r)) return false
       if (q < 10) break
       p = p * 10
   }
   return true

}

var listMags = Fn.new { |from, thru, digs, perLine|

   if (from < 2) {
       System.print("\nFirst %(thru) magnanimous numbers:")
   } else {
       System.print("\n%(Conv.ord(from)) through %(Conv.ord(thru)) magnanimous numbers:")
   }
   var i = 0
   var c = 0
   while (c < thru) {
       if (isMagnanimous.call(i)) {
           c = c + 1
           if (c >= from) {
               System.write(Fmt.d(digs, i) + " ")
               if (c % perLine == 0) System.print()
           }
       }
       i = i + 1
   }

}

listMags.call(1, 45, 3, 15) listMags.call(241, 250, 1, 10) listMags.call(391, 400, 1, 10)</lang>

Output:
First 45 magnanimous numbers:
  0   1   2   3   4   5   6   7   8   9  11  12  14  16  20 
 21  23  25  29  30  32  34  38  41  43  47  49  50  52  56 
 58  61  65  67  70  74  76  83  85  89  92  94  98 101 110 

241st through 250th magnanimous numbers:
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407 

391st through 400th magnanimous numbers:
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081