#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
long long fact[1 << 20], FINV[1 << 20];
long long POW(long long x, long long y) {
  if (y == 0) return 1;
  long long ret = POW(x, y / 2);
  ret *= ret;
  ret %= MOD;
  if (y % 2) ret *= x;
  return ret % MOD;
}
long long inv(long long x) { return POW(x, MOD - 2); }
void pre() {
  fact[0] = 1;
  for (int j = 1; j < (1 << 20); j++) fact[j] = (1ll * j * fact[j - 1]) % MOD;
  for (int j = 0; j < (1 << 20); j++) FINV[j] = inv(fact[j]);
}
long long C(int x, int y) {
  long long ret = fact[x] * FINV[y];
  ret %= MOD;
  ret *= FINV[x - y];
  ret %= MOD;
  return ret;
}
int main() {
  int x, y;
  cin >> x >> y;
  if ((y % x)) {
    puts("0");
    return 0;
  }
  vector<int> facts;
  int aaa = y;
  y /= x;
  for (int j = 2; j * j <= y; j++) {
    if (y % j == 0) {
      facts.push_back(j);
      while (y % j == 0) y /= j;
    }
  }
  if (y > 1) facts.push_back(y);
  y = aaa;
  int ans = 0;
  for (int mask = 0; mask < (1 << facts.size()); mask++) {
    long long shit = x;
    long long coef = 1;
    for (int j = 0; j < facts.size(); j++) {
      if ((mask & (1 << j))) {
        shit *= facts[j];
        coef = -coef;
      }
    }
    ans += coef * POW(2, (y / shit) - 1);
    if (ans < 0) ans += MOD;
    ans %= MOD;
  }
  cout << ans << endl;
}
