import java.util.Arrays;
import java.util.Comparator;

public class Euler816 {

    static class Point {
        int x, y;

        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    static Point[] generatePoints(int k) {
        long mod = 50515093L;
        long s = 290797L;
        Point[] pts = new Point[k];

        for (int i = 0; i < k; ++i) {
            int x = (int) s;
            s = (s * s) % mod;
            int y = (int) s;
            s = (s * s) % mod;
            pts[i] = new Point(x, y);
        }

        return pts;
    }

    static long dist2(Point a, Point b) {
        long dx = a.x - b.x;
        long dy = a.y - b.y;
        return dx * dx + dy * dy;
    }

    static long closestPair(Point[] pts, int l, int r, Point[] strip) {
        if (r - l <= 3) {
            long d = Long.MAX_VALUE;
            for (int i = l; i < r; ++i) {
                for (int j = i + 1; j < r; ++j) {
                    d = Math.min(d, dist2(pts[i], pts[j]));
                }
            }
            return d;
        }

        int m = l + (r - l) / 2;
        int midX = pts[m].x;

        long dl = closestPair(pts, l, m, strip);
        long dr = closestPair(pts, m, r, strip);
        long d = Math.min(dl, dr);

        int stripCount = 0;
        for (int i = l; i < r; ++i) {
            long dx = pts[i].x - midX;
            if (dx * dx < d) {
                strip[stripCount++] = pts[i];
            }
        }

        Arrays.sort(strip, 0, stripCount, Comparator.comparingInt(p -> p.y));

        for (int i = 0; i < stripCount; ++i) {
            for (int j = i + 1; j < stripCount; ++j) {
                long dy = strip[j].y - strip[i].y;
                if (dy * dy >= d) {
                    break;
                }
                d = Math.min(d, dist2(strip[i], strip[j]));
            }
        }

        return d;
    }

    static double closestDistance(int k) {
        Point[] pts = generatePoints(k);
        Arrays.sort(pts, (a, b) -> {
            if (a.x != b.x)
                return Integer.compare(a.x, b.x);
            return Integer.compare(a.y, b.y);
        });

        Point[] strip = new Point[k];
        long best2 = closestPair(pts, 0, k, strip);
        return Math.sqrt(best2);
    }

    public static String solve() {
        double ans = closestDistance(2000000);
        return String.format(java.util.Locale.US, "%.9f", ans);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
