400 Articles and counting...
For the purpose of this article, I have defined «Prime Time» as a period of time (an interval) between a start and end time, where both times and the interval are prime numbers.
We restrict ourselves to a single generic day (a 24 hour period), i.e. the interval 0 - 1440 minutes.
If you want the traditional definition, consult e.g. Wikipedia.
Here is a program looking for the longest Prime Time interval in a day.
File: prime-time-minutes#!/usr/bin/env raku
unit sub MAIN (:v(:$verbose));
constant $DAY-AS-MINUTES = 24 * 60; # 1440
my $s = 0;
my $e = 0;
my $max = 0;
my $count = 0;
for 0 .. $DAY-AS-MINUTES -1 -> $start
{
next unless $start.is-prime;
for $start + 1 .. $DAY-AS-MINUTES -> $end
{
next unless $end.is-prime;
my $length = $end - $start;
next unless $length.is-prime;
my $new-max = $length > $max;
say ": Prime time #{ ++$count }: $start ({ hhmm($start) }) \
- $end ({ hhmm($end) }) = $length min ({ hhmm($length) }) \
{ $new-max ?? "-> new max" !! "" }" if $verbose;
if $new-max
{
$s = $start;
$e = $end;
$max = $length;
}
}
}
say $max
?? "$s ({ hhmm($s) }) - $e ({ hhmm($e) }) = $max min \
({ hhmm($max) })"
!! "0";
sub hhmm($min)
{
my ($m, $h) = $min.polymod(60);
return sprintf("%02d:%02d", $h, $m);
}
[5] The number of minutes in a day is constant, so make it
so.
See docs.raku.org/syntax/constant for more information about constant.
[7,8,9] The start, end and length of the longest interval we have found so far.
[12] Iterate over all the possible start times.
[14] Skip this start time if it is not prime.
[16] Iterate over all the possible end times.
[18] Skip this end time if it is not prime.
[20] Get the length of the interval.
[22] Skip this interval if it is not prime.
[30] Do we have a new max (longest interval)?
[32,33,34] If so, save the start, end and length.
[39] Pretty print the result, unless it is zero.
[46] I use the handy polymod to split the (up to 1440) minutes
into hours (that have 60 minutes each, thus the argument) and minutes.
See docs.raku.org/routine/polymod for more information about polymod.
Running it:
$ ./prime-time-minutes
2 (00:02) - 1429 (23:49) = 1427 min (23:47)
With verbose mode:
$ ./prime-time-minutes -v
: Prime time #1: 2 (00:02) - 5 (00:05) = 3 min (00:03) -> new max
: Prime time #2: 2 (00:02) - 7 (00:07) = 5 min (00:05) -> new max
: Prime time #3: 2 (00:02) - 13 (00:13) = 11 min (00:11) -> new max
: Prime time #4: 2 (00:02) - 19 (00:19) = 17 min (00:17) -> new max
: Prime time #5: 2 (00:02) - 31 (00:31) = 29 min (00:29) -> new max
: Prime time #6: 2 (00:02) - 43 (00:43) = 41 min (00:41) -> new max
: Prime time #7: 2 (00:02) - 61 (01:01) = 59 min (00:59) -> new max
: Prime time #8: 2 (00:02) - 73 (01:13) = 71 min (01:11) -> new max
: Prime time #9: 2 (00:02) - 103 (01:43) = 101 min (01:41) -> new max
: Prime time #10: 2 (00:02) - 109 (01:49) = 107 min (01:47) -> new max
: Prime time #11: 2 (00:02) - 139 (02:19) = 137 min (02:17) -> new max
: Prime time #12: 2 (00:02) - 151 (02:31) = 149 min (02:29) -> new max
: Prime time #13: 2 (00:02) - 181 (03:01) = 179 min (02:59) -> new max
: Prime time #14: 2 (00:02) - 193 (03:13) = 191 min (03:11) -> new max
: Prime time #15: 2 (00:02) - 199 (03:19) = 197 min (03:17) -> new max
: Prime time #16: 2 (00:02) - 229 (03:49) = 227 min (03:47) -> new max
: Prime time #17: 2 (00:02) - 241 (04:01) = 239 min (03:59) -> new max
: Prime time #18: 2 (00:02) - 271 (04:31) = 269 min (04:29) -> new max
: Prime time #19: 2 (00:02) - 283 (04:43) = 281 min (04:41) -> new max
: Prime time #20: 2 (00:02) - 313 (05:13) = 311 min (05:11) -> new max
: Prime time #21: 2 (00:02) - 349 (05:49) = 347 min (05:47) -> new max
: Prime time #22: 2 (00:02) - 421 (07:01) = 419 min (06:59) -> new max
: Prime time #23: 2 (00:02) - 433 (07:13) = 431 min (07:11) -> new max
: Prime time #24: 2 (00:02) - 463 (07:43) = 461 min (07:41) -> new max
: Prime time #25: 2 (00:02) - 523 (08:43) = 521 min (08:41) -> new max
: Prime time #26: 2 (00:02) - 571 (09:31) = 569 min (09:29) -> new max
: Prime time #27: 2 (00:02) - 601 (10:01) = 599 min (09:59) -> new max
: Prime time #28: 2 (00:02) - 619 (10:19) = 617 min (10:17) -> new max
: Prime time #29: 2 (00:02) - 643 (10:43) = 641 min (10:41) -> new max
: Prime time #30: 2 (00:02) - 661 (11:01) = 659 min (10:59) -> new max
: Prime time #31: 2 (00:02) - 811 (13:31) = 809 min (13:29) -> new max
: Prime time #32: 2 (00:02) - 823 (13:43) = 821 min (13:41) -> new max
: Prime time #33: 2 (00:02) - 829 (13:49) = 827 min (13:47) -> new max
: Prime time #34: 2 (00:02) - 859 (14:19) = 857 min (14:17) -> new max
: Prime time #35: 2 (00:02) - 883 (14:43) = 881 min (14:41) -> new max
: Prime time #36: 2 (00:02) - 1021 (17:01) = 1019 min (16:59) -> new max
: Prime time #37: 2 (00:02) - 1033 (17:13) = 1031 min (17:11) -> new max
: Prime time #38: 2 (00:02) - 1051 (17:31) = 1049 min (17:29) -> new max
: Prime time #39: 2 (00:02) - 1063 (17:43) = 1061 min (17:41) -> new max
: Prime time #40: 2 (00:02) - 1093 (18:13) = 1091 min (18:11) -> new max
: Prime time #41: 2 (00:02) - 1153 (19:13) = 1151 min (19:11) -> new max
: Prime time #42: 2 (00:02) - 1231 (20:31) = 1229 min (20:29) -> new max
: Prime time #43: 2 (00:02) - 1279 (21:19) = 1277 min (21:17) -> new max
: Prime time #44: 2 (00:02) - 1291 (21:31) = 1289 min (21:29) -> new max
: Prime time #45: 2 (00:02) - 1303 (21:43) = 1301 min (21:41) -> new max
: Prime time #46: 2 (00:02) - 1321 (22:01) = 1319 min (21:59) -> new max
: Prime time #47: 2 (00:02) - 1429 (23:49) = 1427 min (23:47) -> new max
: Prime time #48: 3 (00:03) - 5 (00:05) = 2 min (00:02)
: Prime time #49: 5 (00:05) - 7 (00:07) = 2 min (00:02)
: Prime time #50: 11 (00:11) - 13 (00:13) = 2 min (00:02)
: Prime time #51: 17 (00:17) - 19 (00:19) = 2 min (00:02)
: Prime time #52: 29 (00:29) - 31 (00:31) = 2 min (00:02)
: Prime time #53: 41 (00:41) - 43 (00:43) = 2 min (00:02)
: Prime time #54: 59 (00:59) - 61 (01:01) = 2 min (00:02)
: Prime time #55: 71 (01:11) - 73 (01:13) = 2 min (00:02)
: Prime time #56: 101 (01:41) - 103 (01:43) = 2 min (00:02)
: Prime time #57: 107 (01:47) - 109 (01:49) = 2 min (00:02)
: Prime time #58: 137 (02:17) - 139 (02:19) = 2 min (00:02)
: Prime time #59: 149 (02:29) - 151 (02:31) = 2 min (00:02)
: Prime time #60: 179 (02:59) - 181 (03:01) = 2 min (00:02)
: Prime time #61: 191 (03:11) - 193 (03:13) = 2 min (00:02)
: Prime time #62: 197 (03:17) - 199 (03:19) = 2 min (00:02)
: Prime time #63: 227 (03:47) - 229 (03:49) = 2 min (00:02)
: Prime time #64: 239 (03:59) - 241 (04:01) = 2 min (00:02)
: Prime time #65: 269 (04:29) - 271 (04:31) = 2 min (00:02)
: Prime time #66: 281 (04:41) - 283 (04:43) = 2 min (00:02)
: Prime time #67: 311 (05:11) - 313 (05:13) = 2 min (00:02)
: Prime time #68: 347 (05:47) - 349 (05:49) = 2 min (00:02)
: Prime time #69: 419 (06:59) - 421 (07:01) = 2 min (00:02)
: Prime time #70: 431 (07:11) - 433 (07:13) = 2 min (00:02)
: Prime time #71: 461 (07:41) - 463 (07:43) = 2 min (00:02)
: Prime time #72: 521 (08:41) - 523 (08:43) = 2 min (00:02)
: Prime time #73: 569 (09:29) - 571 (09:31) = 2 min (00:02)
: Prime time #74: 599 (09:59) - 601 (10:01) = 2 min (00:02)
: Prime time #75: 617 (10:17) - 619 (10:19) = 2 min (00:02)
: Prime time #76: 641 (10:41) - 643 (10:43) = 2 min (00:02)
: Prime time #77: 659 (10:59) - 661 (11:01) = 2 min (00:02)
: Prime time #78: 809 (13:29) - 811 (13:31) = 2 min (00:02)
: Prime time #79: 821 (13:41) - 823 (13:43) = 2 min (00:02)
: Prime time #80: 827 (13:47) - 829 (13:49) = 2 min (00:02)
: Prime time #81: 857 (14:17) - 859 (14:19) = 2 min (00:02)
: Prime time #82: 881 (14:41) - 883 (14:43) = 2 min (00:02)
: Prime time #83: 1019 (16:59) - 1021 (17:01) = 2 min (00:02)
: Prime time #84: 1031 (17:11) - 1033 (17:13) = 2 min (00:02)
: Prime time #85: 1049 (17:29) - 1051 (17:31) = 2 min (00:02)
: Prime time #86: 1061 (17:41) - 1063 (17:43) = 2 min (00:02)
: Prime time #87: 1091 (18:11) - 1093 (18:13) = 2 min (00:02)
: Prime time #88: 1151 (19:11) - 1153 (19:13) = 2 min (00:02)
: Prime time #89: 1229 (20:29) - 1231 (20:31) = 2 min (00:02)
: Prime time #90: 1277 (21:17) - 1279 (21:19) = 2 min (00:02)
: Prime time #91: 1289 (21:29) - 1291 (21:31) = 2 min (00:02)
: Prime time #92: 1301 (21:41) - 1303 (21:43) = 2 min (00:02)
: Prime time #93: 1319 (21:59) - 1321 (22:01) = 2 min (00:02)
: Prime time #94: 1427 (23:47) - 1429 (23:49) = 2 min (00:02)
2 (00:02) - 1429 (23:49) = 1427 min (23:47)
Fun Fact: All the Prime Times have 2 as either start or length.
Here is a rewrite of «prime-time-minutes» that uses seconds. There are 60*60*24 seconds in a day.
File: prime-time-seconds#!/usr/bin/env raku
unit sub MAIN (:v(:$verbose));
constant $DAY-AS-SECONDS = 24 * 60 * 60; # 86400
my $s = 0;
my $e = 0;
my $max = 0;
my $count = 0;
for 0 .. $DAY-AS-SECONDS -1 -> $start
{
next unless $start.is-prime;
for $start + 1 .. $DAY-AS-SECONDS -> $end
{
next unless $end.is-prime;
my $length = $end - $start;
next unless $length.is-prime;
my $new-max = $length > $max;
say ": Prime time #{ ++$count }: $start ({ hhmmss($start) \
}) - $end ({ hhmmss($end) }) = $length min ({ \
hhmmss($length) }) { $new-max ?? "-> new max" !! "" }" \
if $verbose;
if $new-max
{
$s = $start;
$e = $end;
$max = $length;
}
}
}
say $max
?? "$s ({ hhmmss($s) }) - $e ({ hhmmss($e) }) = $max min \
({ hhmmss($max) })"
!! "0";
sub hhmmss($min)
{
my ($s, $m, $h) = $min.polymod(60, 60);
return sprintf("%02d:%02d:%02d", $h, $m, $s);
}
[47] Note the second «60» argument to polymod, as there are
60 seconds in a minute, and 60 minutes in an hour.
Running it:
./prime-time-seconds
2 (00:00) - 86371 (23:59) = 86369 min (23:59)
Verbose mode, without the middle part:
$ ./prime-time-seconds -v
: Prime time #1: 2 (00:00:02) - 5 (00:00:05) = 3 sec (00:00:03) -> new max
: Prime time #2: 2 (00:00:02) - 7 (00:00:07) = 5 sec (00:00:05) -> new max
...
: Prime time #2161: 86351 (23:59:11) - 86353 (23:59:13) = 2 sec (00:00:02)
: Prime time #2162: 86369 (23:59:29) - 86371 (23:59:31) = 2 sec (00:00:02)
2 (00:00:02) - 86371 (23:59:31) = 86369 sec (23:59:29)
Fun Fact: All the Prime Times have 2 as either start or length, just as when we used minutes.
The first program (the one with the minutes) took about half a minute on my oldish laptop, and the second one (the one with the seconds, pun intended) took slightly more than 3 minutes.
But we can make it faster.
The problem is verbose mode, or rather my fondness of it. We can save a lot of time if we reverse the second loop, and short circuit it (see [25]). Verbose mode has been ditched, as the output would be incomplete.
And, yes. I have combined both programs into one. It will use seconds by default, but specify "-m" on the command line to get minutes instead.
File: prime-time-fast#!/usr/bin/env raku
unit sub MAIN (:m(:$minutes));
constant $DAY-AS-MINUTES = 24 * 60; # 1440
constant $DAY-AS-SECONDS = 24 * 60 * 60; # 86400
my $s = 0;
my $e = 0;
my $max = 0;
my $count = 0;
my $limit = $minutes ?? $DAY-AS-MINUTES !! $DAY-AS-SECONDS;
for 2 .. $limit -> $start
{
next unless $start.is-prime;
for $limit ... $start + 1 -> $end
{
next unless $end.is-prime;
my $length = $end - $start;
last if $length <= $max;
next unless $length.is-prime;
my $new-max = $length > $max;
$s = $start;
$e = $end;
$max = $length;
}
}
if $max
{
say $minutes
?? "$s ({ hhmmss($s) }) - $e ({ hhmmss($e) }) = $max min ({ hhmmss($max) })"
!! "$s ({ mmss($s) }) - $e ({ mmss($e) }) = $max sec ({ mmss($max) })";
}
else
{
say 0;
}
sub mmss($min)
{
my ($s, $m) = $min.polymod(60);
return sprintf("%02d:%02d", $m, $s);
}
sub hhmmss($min)
{
my ($s, $m, $h) = $min.polymod(60, 60);
return sprintf("%02d:%02d:%02d", $h, $m, $s);
}
[3] Specify "-m" or "-minutes" on the command line to get minutes instead of seconds.
[12] The upper limit in minutes or seconds.
[18] Iterate from the end, so that we begin with the longest interval.
[24] Skip the inner loop as all the remaining intervals are shorter than the current max.
Running it:
$ ./prime-time-fast
2 (00:02) - 86371 (1439:31) = 86369 sec (1439:29)
$ ./prime-time-fast -m
2 (00:00:02) - 1429 (00:23:49) = 1427 min (00:23:47)
Running time for seconds: 0.9 seconds and minutes: 0.5 seconds. This is fast enough...