#include <bits/stdc++.h>
using namespace std;
const int sz = 1500000;
const long long MAX = 10000000000000000;
template <typename T>
T abs(T a) {
  return a < 0 ? -a : a;
}
const long long MOD = 1e9 + 9;
const long long MASK = 1099511627776LL;
int napr[8][2] = {{0, 1}, {1, 0},  {-1, 0}, {0, -1},
                  {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
const int PRIME = 4999999;
vector<set<int> > graph;
vector<int> f;
long long maxV = 1000000000;
int gcd(int a, int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
struct node {
  node* l;
  node* r;
  long long res;
};
vector<int> a;
vector<int> path;
vector<int> points;
vector<pair<int, int> > result;
int n;
int main() {
  long long x, y, a, b;
  cin >> x >> y >> a >> b;
  long long c = (x * y) / gcd(x, y);
  long long l = 1, r = b;
  long long minV = 0;
  while (l <= r) {
    long long mid = (l + r) / 2;
    if (c * mid < a) {
      l = mid + 1;
    } else {
      r = mid - 1;
      minV = mid;
    }
  }
  l = 0, r = b;
  long long maxV = 0;
  while (l <= r) {
    long long mid = (l + r) / 2;
    if (c * mid > b) {
      r = mid - 1;
    } else {
      maxV = mid;
      l = mid + 1;
    }
  }
  if (((maxV * c >= a && maxV * c <= b) || (minV * c >= a && minV * c <= b))) {
    cout << maxV - minV + 1 << endl;
  } else {
    cout << 0 << endl;
  }
  return 0;
}
